Проблема с ruby ​​net :: HTTP, выдающим SOAP-запрос - PullRequest
0 голосов
/ 13 апреля 2011

Прежде всего, извините за то, что я знаю, это ужасный идиоматический код 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 (логин, запрос, выход из системы), и он будет работать без нареканий, но по какой-то причинеПохоже, что-то не так, если это объединено в сценарии.

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

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

Спасибо!

1 Ответ

0 голосов
/ 14 апреля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...