【问题标题】:SOAP + SSL + Ruby Savon - HTTPClient::ConnectTimeoutError: execution expiredSOAP + SSL + Ruby Savon - HTTPClient::ConnectTimeoutError:执行已过期
【发布时间】:2011-08-19 07:02:18
【问题描述】:

我正在尝试获取一个简单的 ruby​​ 脚本来向 SOAP API 发送请求,但我无法获得回复。

这就是我想要做的:

require 'date'
require 'savon'

# Create the client
client = Savon::Client.new do
  wsdl.document = File.expand_path("path to wsdl document", __FILE__)
end

# Setup namespaces and credentials
client.wsdl.namespace = "http://www.example.com"
client.wsse.credentials "[USERNAME]", "[PASSWORD]"

# Setup ssl configuration
client.http.auth.ssl.cert_key_file = "path to key pem file"
client.http.auth.ssl.cert_file = "path to cert pem file"
client.http.auth.ssl.verify_mode=:peer

# execute request
response = client.request :sub, :get_data do
  soap.body = {"sub:id" => "123456"}
end

此请求以:

结束
D, [2011-05-05T10:21:45.014588 #22136] DEBUG -- : SOAP request: "http://www.example.com"
D, [2011-05-05T10:21:45.014743 #22136] DEBUG -- : Content-Type: text/xml;charset=UTF-8, SOAPAction: "getData"
D, [2011-05-05T10:21:45.014787 #22136] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?><env:Envelope  ...(XML request)...  </env:Body></env:Envelope>
D, [2011-05-05T10:21:45.014864 #22136] DEBUG -- : HTTPI executes HTTP POST using the httpclient adapter
HTTPClient::ConnectTimeoutError: execution expired

但是,当我尝试通过 curl 发送相同的请求时,它可以正常工作(将上面的 xml 请求复制到 soap-request.xml 文件中):

curl -k -v --header "Content-Type: text/xml;charset=UTF-8, SOAPAction: 'getData'" https://www.example.com -d@soap-request.xml --cert-type PEM --cert path_to_pem_file_with_both_key_and_cert

关于我在 ruby​​ 脚本中缺少什么的任何想法?

提前致谢。

更新:

如果 WSDL 文档正确,上面的代码就可以工作。但是,如果没有一个或它是错误的,只需将客户端声明替换为:

# Create the client
client = Savon::Client.new do
  wsdl.endpoint = "https://whateverendpoint.com"
  wsdl.namespace = "http://whatevernamespace.com"
end

最后,按照 Savon 的文档中的描述捕获可能的错误也是一个好主意:

begin
  # execute request
  response = client.request :sub, :get_data do
    soap.body = {"sub:id" => "123456"}
  end
rescue Savon::SOAP::Fault => fault
puts fault.to_s
end

【问题讨论】:

    标签: ruby soap ssl curl savon


    【解决方案1】:

    您是否尝试过延长 http 超时时间?我在服务器端花费了很长时间的一些 SOAP 调用也遇到了同样的问题。我做的是这个

    jira = Savon::Client.new do
      wsdl.document = 'http://jira.xxx.com/rpc/soap/jirasoapservice-v2?wsdl'
    end
    
    jira.http.read_timeout = 300
    
    done = 0
    dotPrinter = Thread.new do
      sec = 0
        while(done==0) do
          sleep 1
          $STDERR.print "\b\b\b%03i" % sec
          sec += 1
        end
    end
    
    resp = jira.request :get_issues_from_filter do
      soap.body = {:in0 => jira_token, :in1 => 18579}
    end
    done = 1
    

    【讨论】:

    • 我曾尝试延长 http 超时时间,但没有奏效。但是,我在网上看到问题可能出在 wsdl 文档中,事实上确实如此。我收到了一份错误的文件。我刚刚删除了 wsdl 文档声明并将 wsdl 端点和命名空间添加到客户端声明中,它现在可以工作了。无论如何感谢您的评论。我将在上面添加修复程序。
    猜你喜欢
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多