2011-05-05 72 views
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 

回答

1

您是否嘗試過擴展http超時?我在服務器端花了很長時間處理同樣的問題。我做的是這樣的

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 
+0

我試圖擴展http超時,但沒有奏效。但是,我在網上讀到這個問題可能在wsdl文件中,事實上是這樣。我被給了一個錯誤的文件。我剛剛刪除了wsdl文檔聲明,並將wsdl端點和名稱空間添加到了客戶端聲明中,並且它現在可用。無論如何,感謝您的評論。我將添加上面的修復程序。 – carvil 2011-05-09 08:46:56