首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在使用savon进行ruby soap通信时,"wsdl“名称空间会被插入到action名称中?

为什么在使用savon进行ruby soap通信时,"wsdl“名称空间会被插入到action名称中?
EN

Stack Overflow用户
提问于 2010-02-19 13:44:29
回答 4查看 8.8K关注 0票数 9

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

代码语言:javascript
复制
<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标记应为:

代码语言:javascript
复制
    <ProcessMessage xmlns="http://www.starstandards.org/webservices/2005/10/transport">

当它是由示例Java应用程序生成的时候,它就是这样的,并且它可以工作。这个标记是我的Ruby应用程序生成的内容与示例Java应用程序之间唯一的区别。有没有办法去掉那个标签前面的"wsdl:"命名空间,然后添加一个这样的属性。除此之外,有没有一种方法可以强制动作不像主体的其余部分那样作为字符串传递?

下面是我的代码:

代码语言:javascript
复制
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更令人困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-17 04:39:12

史蒂夫,你看到wsdl:在ProcessMessage标签前面了吗?-我以为这是唯一让我失望的事情,但事实并非如此(顺便说一句,它很难在Savon lib第160行的soap.rb中设置)。即使我不在soap.namespaces中分隔它-它也很难生成并附加到最终的xml中。这是我的服务不允许的。

虽然生成的xml是一个有效的xml -但它不能满足我试图与之交谈的服务的要求。即:在生成的xml中,

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>

标签丢失了,另外,我在头文件中需要PayloadManifest,另外我还需要wsse:标签中的wsu:created和wsu:expires,但它们没有实现,等等,还有一堆对我的情况太特殊的小问题。但是,soap有一个私有方法= xml_body。另外,to_xml方法中的soap lib在生成自己的xml之前,会检查是否已经设置了@xml_body。所以我最终稍微修改了一下soap的行为。通过使soap.xml_body =可公开访问。所以我能够做到:

代码语言:javascript
复制
response = client.process_message! do |soap| 
soap.action = "http://www.starstandards.org/webservices/2005/10/transport/operations/ProcessMessage"
soap.xml_body = "MY XML STRING GENERATED ELSEWHERE GOES HERE"
end

终于成功了!

我会建议rubii这样做-如果这个选项可用,将解决许多罕见的情况-人们可以生成他们的自定义xml并使用savon库的其余部分。

票数 4
EN

Stack Overflow用户

发布于 2010-03-16 17:20:06

您需要将一个数组传递给soap.input,该数组的第二个元素是包含名称空间详细信息的散列。

代码语言:javascript
复制
soap.input = [ 
  "ProcessMessage", 
  {"xmlns" => "http://www.starstandards.org/webservices/2005/10/transport"}
]

这将确保您最终将名称空间声明作为main元素的一个属性。

您可能还会在元素之前添加一个名称空间声明,如下所示

代码语言:javascript
复制
<env:Body>
    <wsdl:ProcessMessage xmlns="........." >
        <payload>
            ......
        </payload>
    </wsdl:ProcessMessage>
</env:Body>

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

票数 10
EN

Stack Overflow用户

发布于 2011-08-07 06:26:01

对于我的web服务,我需要在Steve的解决方案之上去掉"wsdl"名称空间。

使用Savon 0.9.6进行测试:

代码语言:javascript
复制
client = Savon::Client.new "https://example.com/webservice/account.asmx?WSDL"
response = client.request "GetAccount" do
  # Gotcha 1: set default namespace for body elements
  soap.input = ["GetAccount", {"xmlns" => "https://example.com/webservice/"}]
  soap.body = {
    "AccountID" => 1234
  }
  # Gotcha 2: get rid of namespace declaration of body elements
  soap.element_form_default = :unqualified
  # Gotcha 3: set SOAPAction different from default
  http.headers["SOAPAction"] = '"https://example.com/webservice/GetAccount"'
end
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2294325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档