我正在尝试使用Savon用Ruby发出SOAP请求,但是我收到了来自服务器的400 Bad Request响应。
这是我正在尝试制作的请求(根据soapUI):
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:apis="http://www.csisoftwareusa.com/ApiService">
<soap:Header/>
<soap:Body>
<apis:AuthenticateConsumer>
<!--Optional:-->
<apis:consumerName>?</apis:consumerName>
<!--Optional:-->
<apis:consumerPassword>?</apis:consumerPassword>
</apis:AuthenticateConsumer>
</soap:Body>
</soap:Envelope>
这是我用Ruby制作的请求;它返回400 Bad Request错误:
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<ins0:AuthenticateConsumer>
<ins0:consumerName>?</ins0:consumerName>
<ins0:consumerPassword>?</ins0:consumerPassword>
</ins0:AuthenticateConsumer>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Http Headers: SOAPAction: "http://www.csisoftwareusa.com/ApiService/AuthenticateConsumer", Content-Type: text/xml;charset=UTF-8, Content-Length: 504
这是我用Python做的请求。这个要求成功了:
<SOAP-ENV:Envelope>
<SOAP-ENV:Header/>
<ns0:Body>
<ns1:AuthenticateConsumer>
<ns1:consumerName>?</ns1:consumerName>
<ns1:consumerPassword>?</ns1:consumerPassword>
</ns1:AuthenticateConsumer>
</ns0:Body>
</SOAP-ENV:Envelope>
Http headers: {'SOAPAction': u'"http://www.csisoftwareusa.com/ApiService/AuthenticateConsumer"', 'Content-Type': 'text/xml; charset=utf-8'}
我需要将对此API的调用集成到Rails应用程序中,因此在Python中执行它不是一个有效的解决方案。
我想知道是否有人能看到我所缺少的东西。空<SOAP-ENV:Header />
标记是否存在问题,如果是,我该如何将其添加到Savon请求中?
谢谢, 斯图尔特
答案 0 :(得分:0)
这里的问题是我的http标题:由于url中包含空格,因此必须对url进行编码。但是,我必须在将它传递给Savon之前对其进行编码,然后Savon再次对其进行编码 - 这个双重编码的URL失败了。请参阅:https://stackoverflow.com/questions/14482251/ruby-savon-soap-request-double-escapes-spaces-in-url
谢谢, 斯图尔特
答案 1 :(得分:0)
我收到HTTP 400,因为我的请求重复了名称空间。
我的代码:
require 'savon'
namespaces = {
"xmlns:soap": "http://schemas.xmlsoap.org/soap/envelope/",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
}
client = Savon.client(
...
:namespace => namespaces
}
我删除了:namespace选项,错误消失了。
我是怎么发现的?
使用 build_request 代替 call 并打印请求正文:
client.build_request(:search, message: {...})
puts request.body
将您从调试中获得的请求粘贴到SoapUI中,并一步一步地进行更改,直到该请求在SoapUI中成功为止。