Проблема с ruby net:: HTTP, выдающий запрос SOAP

#ruby #http #soap

#ruby #http #soap

Вопрос:

Прежде всего, извините за то, что я знаю, это ужасный идиоматический код Ruby.

Я пытаюсь отправить серию запросов SOAP в Oracle CRM OnDemand, используя скрипт ruby, и я сталкиваюсь с проблемой. Я могу выдавать запросы просто отлично, используя Poster для FireFox, но когда я пытаюсь выдать их с помощью Ruby, он выдает следующее:

Внутренняя ошибка: сеанс недоступен. Прерывание.

Oracle CRM OnDemand требует cookie сеанса авторизации. Ниже приведен код, который я использую:

 httpOracle = Net::HTTP.new(ORACLE_BASE_URL, ORACLE_PORT)
httpOracle.use_ssl = true
httpOracle.verify_mode = OpenSSL::SSL::VERIFY_NONE
httpOracle.set_debug_output $stderr

begin
    # CONNECT TO ORACLE AND RETRIEVE A SESSION ID
    pathOracle = buildOracleLoginPath()
    headOracle = { "username" => ORACLE_USERNAME,
                   "password" => ORACLE_PASSWORD }
    respOracle = httpOracle.request_head(pathOracle, headOracle)
    authOracle = respOracle['set-cookie']
                           .gsub(/ /, '')
                           .split(';')
                           .find_all { |item| item.match(/^JSESSIONID=/) }[0].to_s

    # RETRIEVE ALL ORACLE LEADS
    pathOracle = buildOraclePath(authOracle)
    headOracle = { "soapaction" => buildOracleSOAPAction("Lead", "QueryPage"),
                   "Content-Type" => "text/xml" }
    rqstOracle = loadPostData 'soap.xml' # Loads file with SOAP payload as a string
    respOracle = httpOracle.request_post(pathOracle, rqstOracle, headOracle)

    puts respOracle    # for testing
rescue
    puts "Error #{$!}"
ensure
    # CLOSE THE CONNECTION TO ORACLE
    pathOracle = buildOracleLogoffPath()
    headOracle = { authOracle.split('=')[0] => authOracle.split('=')[1] }
    respOracle = httpOracle.request_head(pathOracle, headOracle)
end
  

Я могу взять выходные данные каждой из этих команд и передать их через Poster (login, query, logoff), и это будет работать безупречно, но по какой-то причине, похоже, что что-то не так, когда это объединено в скрипт.

Мне было интересно, может быть, проблема в попытке использовать один и тот же Net :: HTTP для нескольких подключений? Или, может быть, я просто неправильно его использую?

Если кому-то это нужно, я могу попытаться выяснить, как перенаправить вывод http в файл, чтобы вы могли видеть публикации, если это полезно.

Спасибо!

Ответ №1:

Я предполагаю, что ввод его дал мне еще несколько критериев поиска для работы, и я наткнулся на это сообщение в блоге. Хотя я все еще хотел бы знать, что я делал неправильно (я думаю, что мне нужно использовать что-то вроде http.start {}, чтобы это сработало), и чем мой код отличается от нажатия кнопок в Poster, добавление заголовков WS-SECURITY к запросу SOAP полностью решило проблему, сделав его запросом без состояния вместо необходимости поддерживать состояние на протяжении всего срока службы процесса.

Спасибо всем, кто нашел время прочитать это!