0

如何使用 Savon 向 body 标签添加编码属性?

一些背景知识:我正在尝试使用 savon 连接到 SOAP 资源。我可以获取 WSDL 文件并浏览这些方法。

@client = Savon::Client.new("http://some.domain.com/v2messaging/service?WSDL")

当我尝试使用登录方法时

response = @client.request :service, :login do
  soap.body = { 
    "String_1" => "username",
    "String_2" => "password"
  }
end

我收到此错误:

失败/错误:响应 = @client.request :service, :login do Savon::SOAP::Fault: (env:Client) 在处理请求时捕获异常:意外编码样式:预期 = http://schemas.xmlsoap.org /soap/encoding/,实际

身体标签的区别。这是预期的 xml(通过 SOAPUI 应用程序找到):

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:service="etapestryAPI/service">
   <env:header/>
   <env:body>
      <service:login env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        <String_1>username</String_1>
        <String_2>password</String_2>
      </service:login>
   </env:body>
</env:Envelope>

萨文发送:

<?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:service="etapestryAPI/service" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins0="http://java.sun.com/jax-rpc-ri/internal" xmlns:ins1="etapestryAPI/service">
    <env:Body>
        <service:login>
            <String_1>username</String_1>
            <String_2>password</String_2>
        </service:login>
    </env:Body>
</env:Envelope>

这些之间有一些区别,但返回的错误与 env:login 标记上的 env:encodingStyle 属性有关。怎么能加这个属性?

4

1 回答 1

1

我想出了这个。要将属性添加到函数标记(在本例中为登录),您可以向该方法传递一个附加参数:

response = @client.request :service, :login, "env:encodingStyle" => "http://schemas.xmlsoap.org/soap/encoding/" do
  soap.body = { 
           "String_1" => "username",
           "String_2" => "password"
         }
end

这可能现在可以在不通过块的情况下工作。

于 2011-11-19T20:26:09.203 回答