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