目标是连接到第三方SOUP API提供商。他们提供了WSDL定义。
我想到的第一件事是使用Savon宝石。所以我实现了它,直截了当的方式,如下所示:
client = Savon.client do
wsdl http://url_to_wsdl/
end
response = client.call(:some_supported_action) do
message message
end
响应正确返回。但我注意到它是在10秒后。所以,像往常一样,我先责怪服务器。所以我在两端进行数据包捕获。并且wiresharks结果显示服务器响应时间<200ms。
然后我做了一些研究,有些人说远程WSDL可能需要一些时间才能被Savon下载。所以我修改了代码以使用本地版本:
client = Savon.client do
wsdl Rails.root.join('config', 'local.xml')
end
现在,我需要将响应时间缩短到5.x秒。也许这是萨翁一次召唤的结果。但它仍然很慢。
接下来,我还读到解析WSDL可能很慢。所以我完全摆脱了WSDL。
client = Savon.client do
endpoint 'my_endpoint'
namespace 'my_namespace'
element_form_default :qualified
end
response = client.call('MethodName',
soap_action: 'SoupActionName',
message: message)
如果没有wsdl解析,响应仍需要5秒。进一步检查WireShark日志,我注意到传出的数据包只在调用client.call后大约5秒发送。
最后,我转而使用&#39; http&#39;而不是&#39; net_http&#39;作为HTTP客户端。也没有什么不同。还是5-6秒。
HTTPI POST request to my_url.com (http)
HTTPI POST request to my_url.com (net_http)
其他信息:
任何人都知道为什么会发生这种情况以及如何解决这个问题?