我在尝试使用Savon 2.1.0进行身份验证构建自定义标头时遇到异常,这是重现问题的示例代码,我将非常感谢您对此主题的任何帮助。
require 'open-uri'
require 'savon'
headers = {
'IvansWSAuthentication' => {
'User' => 'my_user',
'Password' => 'my_pass',
'ClientId' => 'my_client_id'
}
}
x12 = 'test'
client = Savon.client(
wsdl: 'https://limeservices.ivans.com/EligibilityOne.asmx?WSDL',
headers: headers
)
request_params = {
form270: x12
}
response = client.call(:send_commercial_eligibility_form_request, message: request_params)
这是一个例外:
1.9.3-p392 :023 > response = client.call(:send_commercial_eligibility_form_request, message: request_params)
D, [2013-03-05T23:02:30.647097 #11590] DEBUG -- : HTTPI GET request to limeservices.ivans.com (net_http)
I, [2013-03-05T23:02:31.600016 #11590] INFO -- : SOAP request: https://limeservices.ivans.com/EligibilityOne.asmx
I, [2013-03-05T23:02:31.600157 #11590] INFO -- : IvansWSAuthentication: {"User"=>"my_user", "Password"=>"my_pass", "ClientId"=>"my_client_id"}, SOAPAction: "http://tempuri.org/SendCommercialEligibilityFormRequest", Content-Type: text/xml;charset=UTF-8, Content-Length: 389
D, [2013-03-05T23:02:31.600206 #11590] DEBUG -- : <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://tempuri.org/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><tns:SendCommercialEligibilityFormRequest><tns:form270>test</tns:form270></tns:SendCommercialEligibilityFormRequest></env:Body></env:Envelope>
D, [2013-03-05T23:02:31.600474 #11590] DEBUG -- : HTTPI POST request to limeservices.ivans.com (net_http)
NoMethodError: undefined method `strip' for #<Hash:0x007fb044365a50>
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1435:in `block in initialize_http_header'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:451:in `block in each'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:450:in `each'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/rack-1.5.2/lib/rack/utils.rb:450:in `each'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1433:in `initialize_http_header'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:1862:in `initialize'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:2093:in `initialize'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:87:in `new'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:87:in `request_client'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:55:in `block in do_request'
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/lib/ruby/1.9.1/net/http.rb:745:in `start'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:54:in `do_request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi/adapter/net_http.rb:31:in `request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi.rb:137:in `request'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/httpi-2.0.2/lib/httpi.rb:109:in `post'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/operation.rb:59:in `call!'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/operation.rb:48:in `call'
from /Users/rorra/.rvm/gems/ruby-1.9.3-p392/gems/savon-2.1.0/lib/savon/client.rb:38:in `call'
from (irb):23
from /Users/rorra/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'1.9.3-p392 :024 >
答案 0 :(得分:0)
好的,问题是通过在Savon 2.1.0上设置参数“headers”,我正在做的是设置HTTP请求的头,而HTTP Request参数应该是一个键:String,因为ruby HTTP库对Header中包含的每个哈希值调用 strip ,它会引发异常。
我最初的想法是设置自定义soap标头进行身份验证,所以我所要做的就是:
client = Savon.client(
wsdl: 'https://limeservices.ivans.com/EligibilityOne.asmx?WSDL',
soap_header: headers
)