ruby net :: HTTP发出SOAP请求的问题

时间:2011-04-12 20:40:10

标签: ruby http soap

首先,对不起我所知道的可怕的惯用Ruby代码。

我正在尝试使用ruby脚本向Oracle CRM OnDemand发出一系列SOAP请求,但我遇到了问题。我可以使用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 :(得分:0)

我想输入它会给我一些更多的搜索条件,我偶然发现this blog post。虽然我仍然想知道我做错了什么(我认为我必须使用像http.start {}之类的东西来完成这项工作),以及我的代码与单击Poster中的按钮有何不同,添加{{3} SOAP请求的头文件通过使其成为无状态请求而不必在整个过程的生命周期中维护状态来完全解决问题。

感谢任何花时间阅读此内容的人!