2
我想要獲得一個簡單的ruby腳本來向SOAP API發送請求,但是我無法獲得響應。SOAP + SSL + Ruby Savon - HTTPClient :: ConnectTimeoutError:執行過期
這就是我要做的:
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
然而,當我嘗試發送通過捲曲了同樣的要求,它的工作原理(複製XML請求上面的soap-request.xml文件):
curl -k -v --header "Content-Type: text/xml;charset=UTF-8, SOAPAction: 'getData'" https://www.example.com [email protected] --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
最後,它也是一個不錯的主意趕上可能發生的故障爲莎翁的文檔中描述:
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
我試圖擴展http超時,但沒有奏效。但是,我在網上讀到這個問題可能在wsdl文件中,事實上是這樣。我被給了一個錯誤的文件。我剛剛刪除了wsdl文檔聲明,並將wsdl端點和名稱空間添加到了客戶端聲明中,並且它現在可用。無論如何,感謝您的評論。我將添加上面的修復程序。 – carvil 2011-05-09 08:46:56