gpt4 book ai didi

ruby - 为什么在使用 savon 进行 ruby​​ soap 通信时将 "wsdl"命名空间插入到操作名称中?

转载 作者:数据小太阳 更新时间:2023-10-29 06:51:54 25 4
gpt4 key购买 nike

我正在尝试访问我无法控制的 SOAP 服务。其中一个操作称为 ProcessMessage。我按照这个例子生成了一个 SOAP 请求,但我收到一条错误消息,指出该操作不存在。我将问题追溯到生成信封正文的方式。

<env:Envelope ... ">
<env:Header>
<wsse:Security ... ">
<wsse:UsernameToken ...">
<wsse:Username>USER</wsse:Username>
<wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce>
<wsu:Created>2010-02-18T02:05:25Z</wsu:Created>
<wsse:Password ... >password</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</env:Header>
<env:Body>
<wsdl:ProcessMessage>
<payload>
......
</payload>
</wsdl:ProcessMessage>
</env:Body>
</env:Envelope>

ProcessMessage 标签应该是:

    <ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">

这就是示例 Java 应用程序生成它时的样子,并且可以正常工作。该标记是我的 Ruby 应用程序生成的内容与示例 Java 应用程序之间的唯一区别。有什么方法可以去掉那个标签前面的 "wsdl:" 命名空间并添加这样的属性。除此之外,有没有办法强制 Action 不像 body 的其他部分一样通过字符串传递来生成?

这是我的代码:

require 'rubygems'
require 'savon'
client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"

response = client.process_message! do | soap, wsse |
wsse.username = "USER"
wsse.password = "password"
soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
soap.action = "ProcessMessage" #makes no difference
soap.input = "ProcessMessage" #makes no difference

#my body at this point is jsut one big xml string

soap.body = "<payload>...</payload>"
# putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body, since Savon keeps interjecting <wsdl:ProcessMessage> tag.

end

我试过 handsoap,但它不支持 HTTPS 并且令人困惑。我试过 soap4r,但它比 handsoap 更令人困惑。

最佳答案

您需要将一个数组传递给 soap.input,其中第二个元素是包含命名空间详细信息的哈希值。

soap.input = [ 
"ProcessMessage",
{"xmlns" => "http://www.starstandards.org/webservices/2005/10/transport"}
]

这应该确保您最终将 namespace 声明作为主元素的属性。

您可能还会像这样在元素之前声明 namespace

<env:Body>
<wsdl:ProcessMessage xmlns="........." >
<payload>
......
</payload>
</wsdl:ProcessMessage>
</env:Body>

但这对我来说不是问题,问题在于缺少命名空间属性,而不是元素之前存在命名空间。

关于ruby - 为什么在使用 savon 进行 ruby​​ soap 通信时将 "wsdl"命名空间插入到操作名称中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com