【问题标题】:Trying to build the correct SOAP request body with Savon 2尝试使用 Savon 2 构建正确的 SOAP 请求正文
【发布时间】:2017-07-21 03:43:29
【问题描述】:

我需要使用 savon 向外部 API 生成以下 SOAP 请求,这是我得到的成功请求示例:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="urn:ConsultarSucursales"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns2="http://xml.apache.org/xml-soap"
xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Header>
    <ns3:Security env:mustUnderstand="true">
        <ns3:UsernameToken>
            <ns3:Username>XXXX</ns3:Username>
            <ns3:Password>XXXX</ns3:Password>
        </ns3:UsernameToken>
    </ns3:Security>
</env:Header>
<env:Body>
    <ns1:ConsultarSucursales env:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
        <Consulta xsi:type="ns2:Map">
            <item>
                <key xsi:type="xsd:string">consulta</key>
                <value xsi:type="ns2:Map">
                    <item>
                        <key xsi:type="xsd:string">Localidad</key>
                        <value xsi:type="xsd:string"></value>
                    </item>
                    <item>
                        <key xsi:type="xsd:string">CodigoPostal</key>
                        <value xsi:type="xsd:string">1406</value>
                    </item>
                    <item>
                        <key xsi:type="xsd:string">Provincia</key>
                        <value xsi:type="xsd:string"></value>
                    </item>
                </value>
            </item>
        </Consulta>
    </ns1:ConsultarSucursales>
</env:Body>

对于 Savon,我使用了以下代码:

require 'savon'

client = Savon.client do
  wsdl 'https://sucursales.andreani.com/ws?wsdl'
  wsse_auth('XXXXX', 'XXXXX')
  convert_request_keys_to :camelcase
  soap_version 2
  env_namespace :soapenv
  namespace_identifier :ser
  ssl_verify_mode :none
  log true
end

response = client.call :consultar_sucursales, :message => {:consulta => {:codigo_postal => '1406', 'Localidad': nil, 'Provincia': nil}}

生成以下 SOAP 原始请求格式:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ser="urn:ConsultarSucursales"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
    <wsse:Security
        xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
        <wsse:UsernameToken wsu:Id="UsernameToken-1"
            xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
            <wsse:Username>XXXXX</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXXX</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>
<soapenv:Body>
    <ser:ConsultarSucursales>
        <Consulta>
            <CodigoPostal>1406</CodigoPostal>
            <Localidad xsi:nil="true"/>
            <Provincia xsi:nil="true"/>
        </Consulta>
    </ser:ConsultarSucursales>
</soapenv:Body>

此请求目前产生 500 错误。

我对如何生成正确的请求有点迷茫。应该在请求中手动设置命名空间吗?我使用 Savon 生成的请求缺少其他内容?

问题更新:

稍微修改请求后,我设法获得了与 API 服务器中预期的请求头相同的请求头,但是当我将其发送到服务器时仍然出现 500 问题。

我现在与 Savon 一起使用的请求代码如下

namespaces = {
"xmlns:ns1" =>"urn:ConsultarSucursales",
"xmlns:xsi" =>"http://www.w3.org/2001/XMLSchema-instance",
"xmlns:xsd" =>"http://www.w3.org/2001/XMLSchema",
"xmlns:ns2" =>"http://xml.apache.org/xml-soap",
"xmlns:ns3" =>"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
"xmlns:enc" =>"http://www.w3.org/2003/05/soap-encoding"
}

h = %{<ns3:Security env:mustUnderstand="true"><ns3:UsernameToken><ns3:Username>XXXXX</ns3:Username><ns3:Password>XXXX</ns3:Password></ns3:UsernameToken></ns3:Security>}

client = Savon.client do
  wsdl 'https://sucursales.andreani.com/ws?wsdl'
  convert_request_keys_to :camelcase
  soap_version 2
  namespaces namespaces
  env_namespace :env
  log true
  soap_header h
end

生成此 SOAP 请求:

<?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:tns="urn:ConsultarSucursales"
xmlns:env="http://www.w3.org/2003/05/soap-envelope"
xmlns:ns1="urn:ConsultarSucursales"
xmlns:ns2="http://xml.apache.org/xml-soap"
xmlns:ns3="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:enc="http://www.w3.org/2003/05/soap-encoding">
<env:Header>
    <ns3:Security env:mustUnderstand="true">
        <ns3:UsernameToken>
            <ns3:Username>XXXXXX</ns3:Username>
            <ns3:Password>XXXXXX</ns3:Password>
        </ns3:UsernameToken>
    </ns3:Security>
</env:Header>
<env:Body>
    <tns:ConsultarSucursales>
        <Consulta>
            <CodigoPostal>1406</CodigoPostal>
            <Localidad xsi:nil="true"/>
            <Provincia xsi:nil="true"/>
        </Consulta>
    </tns:ConsultarSucursales>
</env:Body>
</env:Envelope>

【问题讨论】:

    标签: soap savon


    【解决方案1】:

    您使用哪个 Savon 版本?

    您似乎错过了标头中的一些属性:

    <ns3:Security env:mustUnderstand="true">
    

    你还提供了一个属性

    <wsse:UsernameToken wsu:Id="UsernameToken-1"
    

    这不在您的模板有效负载中。

    这是您能打出的最简单的电话吗?还有更简单的吗?

    【讨论】:

    • 我使用的是 savon 2.11.1。这是我可以对 API 进行的最简单的调用,问题可能出在正文上,因为我可以使用 ns3:security 块设置整个标题,但我不确定是否有更简单的方法标头作为我需要的请求。
    • 我认为您在正文元素中缺少类型标签。
    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2012-05-05
    相关资源
    最近更新 更多