#ruby-on-rails-3 #soap #savon
#ruby-on-rails-3 #soap #savon
Вопрос:
Я использую драгоценный камень savon в rails для вызова API-интерфейсов электронной почты purolator soap,
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
Вот XML-запрос, который генерируется и отображается Savon
<?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’ отсутствует в заголовке, но я предоставил этот заголовок, и он также отображается в запросе.
Может кто-нибудь, пожалуйста, указать мне правильное направление и сообщить, чего мне здесь не хватает.
Ответ №1:
При добавлении пространства имен он работает:
'purolator:RequestContext' => {
'purolator:Version' => '1.2',
'purolator:Language' => 'en_US',
'purolator:GroupID' => 'xxx',
'purolator:RequestReference' => 'Rating Example'
}