Savon :: SOAPFault:s:Client标头中缺少元素'RequestContext'

问题描述

我在轨道上使用savon gem来调用Purolator E-Ship肥皂API,

gem 'savon',version 2.12.0

这是我调用实际API的代码示例

@client = Savon.client(wsdl: "#{Rails.root.to_s}/app/carriers/wsdls/purolator/tracking_service/TrackingServiceDev.wsdl","soap_header" => {
                "RequestContext" => {
                  "Version" => '1.2',"Language" => 'en_US',"GroupID" => 'xxx',"RequestReference" => 'rating Example'
                }
              },:basic_auth => ["xxxxxxxxxx","xxxxxxxxx"],:log => true,:pretty_print_xml => true,:element_form_default => :unqualified)
body = {
      "PIN" => {
        "Value" => 329014521622
      }
    }
@client.call(:get_delivery_details,message: body).body

这是Savon生成显示的请求XML

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q12="http://purolator.com/pws/service/v1" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://purolator.com/pws/datatypes/v1" xmlns:ins1="http://www.microsoft.com/practices/EnterpriseLibrary/2007/01/wcf/validation" xmlns:ins2="http://schemas.datacontract.org/2004/07/Microsoft.Practices.EnterpriseLibrary.Validation.Integration.WCF">
  <env:Header>
    <RequestContext>
      <Version>1.2</Version>
      <Language>en_US</Language>
      <GroupID>xxx</GroupID>
      <RequestReference>rating Example</RequestReference>
    </RequestContext>
  </env:Header>
  <env:Body>
    <q12:GetDeliveryDetailsRequest>
      <PIN>
        <Value>329014521622</Value>
      </PIN>
    </q12:GetDeliveryDetailsRequest>
  </env:Body>
</env:Envelope>

这是我从API返回的响应

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <s:Fault>
      <faultcode>s:Client</faultcode>
      <faultstring xml:lang="en-CA">Element 'RequestContext' is missing from the header</faultstring>
    </s:Fault>
  </s:Body>
</s:Envelope>

API引发错误消息,标题中缺少元素“ RequestContext”,但我提供了此标题,它也显示在请求中。 谁能给我指出正确的方向,让我知道我在这里想念的东西。

解决方法

添加命名空间时,它起作用:

'purolator:RequestContext' => {
  'purolator:Version'          => '1.2','purolator:Language'         => 'en_US','purolator:GroupID'          => 'xxx','purolator:RequestReference' => 'Rating Example'
}