为什么在使用savon进行ruby soap通信时,“wsdl”命名空间会插入操作名称?

前端之家收集整理的这篇文章主要介绍了为什么在使用savon进行ruby soap通信时,“wsdl”命名空间会插入操作名称?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试访问我无法控制的SOAP服务.其中一个操作称为ProcessMessage.我按照示例生成了一个SOAP请求,但是我收到一条错误,说该操作不存在.我将问题追溯到信封体生成的方式.
  1. <env:Envelope ... ">
  2. <env:Header>
  3. <wsse:Security ... ">
  4. <wsse:UsernameToken ...">
  5. <wsse:Username>USER</wsse:Username>
  6. <wsse:Nonce>658e702d5feff1777a6c741847239eb5d6d86e48</wsse:Nonce>
  7. <wsu:Created>2010-02-18T02:05:25Z</wsu:Created>
  8. <wsse:Password ... >password</wsse:Password>
  9. </wsse:UsernameToken>
  10. </wsse:Security>
  11. </env:Header>
  12. <env:Body>
  13. <wsdl:ProcessMessage>
  14. <payload>
  15. ......
  16. </payload>
  17. </wsdl:ProcessMessage>
  18. </env:Body>
  19. </env:Envelope>

ProcessMessage标签应该是:

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

这就是样本Java应用程序生成它时的工作原理.该标记是我的Ruby应用程序生成的示例和示例Java应用程序之间的唯一区别.有没有办法摆脱那个标签前面的“wsdl:”命名空间并添加这样的属性.除此之外,有没有办法强制动作不是通过像身体其他部分一样传递出来的?

这是我的代码

  1. require 'rubygems'
  2. require 'savon'
  3. client = Savon::Client.new "https://gmservices.pp.gm.com/ProcessMessage?wsdl"
  4.  
  5. response = client.process_message! do | soap,wsse |
  6. wsse.username = "USER"
  7. wsse.password = "password"
  8. soap.namespace = "http://www.starstandards.org/webservices/2005/10/transport" #makes no difference
  9. soap.action = "ProcessMessage" #makes no difference
  10. soap.input = "ProcessMessage" #makes no difference
  11.  
  12. #my body at this point is jsut one big xml string
  13.  
  14. soap.body = "<payload>...</payload>"
  15. # putting <ProccessMessage> tag here doesn't help as it just creates a duplicate tag in the body,since Savon keeps interjecting <wsdl:ProcessMessage> tag.
  16.  
  17. end

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

解决方法

您需要将数组传递给soap.input,其中第二个元素是包含命名空间详细信息的哈希.
  1. soap.input = [
  2. "ProcessMessage",{"xmlns" => "http://www.starstandards.org/webservices/2005/10/transport"}
  3. ]

这应该确保您最终将名称空间声明作为主元素的属性.

您可能也会在元素之前结束命名空间声明

  1. <env:Body>
  2. <wsdl:ProcessMessage xmlns="........." >
  3. <payload>
  4. ......
  5. </payload>
  6. </wsdl:ProcessMessage>
  7. </env:Body>

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

猜你在找的Ruby相关文章