使用带有ruby on rails

时间:2017-07-25 23:32:42

标签: ruby xml web-services soap savon

我正在使用ruby和Savon 2.我获得了以下SOAP示例:

POST /WebApi/Services/b2bapi.asmx HTTP/1.1
Host: api.nationsphotolab.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "https://api.nationsphotolab.com/AddNewOrder"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <AddNewOrder xmlns="http://api.nationsphotolab.com/">
      <orderXml>string</orderXml>
      <passport>
        <Source>string</Source>
        <Hash>string</Hash>
      </passport>
    </AddNewOrder>
  </soap:Body>
</soap:Envelope>

我尝试了许多不同的创建XML的方法,首先使用XmlMarkup构建器,然后只构建一个哈希并将其传递给savon客户端调用。

我得到的错误: Savon::SOAPFault ((soap:Server) Server was unable to process request. ---> Object reference not set to an instance of an object.):

以下是请求:

client = Savon.client(wsdl: "http://api.nationsphotolab.com/WebApi/Services/b2bapi.asmx?wsdl")
response = client.call(:add_new_order, message: data)

数据是使用XmlMarkup构建器创建的XML。 附件是数据截图。

如果我能提供更多信息,请告诉我

示例数据: enter image description here

谢谢!

1 个答案:

答案 0 :(得分:0)

从您的描述看起来,API似乎期望orderXML元素是一个字符串。我认为问题在于,当API期望它包含字符串时,您将XML放入orderXML元素。

转义orderXML元素的内容并将其作为字符串发送应该可以解决问题。

下面的代码显示了一种转义XML字符串的方法: order_xml_string.encode(xml: :text)