SOAP + SSL + Ruby Savon - HTTPClient :: ConnectTimeoutError: срок выполнения истек - PullRequest
2 голосов
/ 05 мая 2011

Я пытаюсь получить простой скрипт 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

1 Ответ

1 голос
/ 06 мая 2011

Вы пытались продлить тайм-аут 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
...