首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在SOAP请求中使用“savon”gem指定命名空间?

如何在SOAP请求中使用“savon”gem指定命名空间?
EN

Stack Overflow用户
提问于 2015-01-05 06:58:18
回答 1查看 1.8K关注 0票数 0

我正在使用最新版本的savon gem,并试图发送SOAP请求,我收到了有关无效url的错误消息:

代码语言:javascript
运行
复制
 Invalid URL: %7Bendpoint%20address%7D (ArgumentError)
        from /home/vagrant/.rvm/gems/ruby-2.1.0/gems/httpi-2.3.0/lib/httpi/request.rb:27:in `url='
        from /home/vagrant/.rvm/gems/ruby-2.1.0/gems/savon-2.8.0/lib/savon/operation.rb:103:in `build_request'
        from /home/vagrant/.rvm/gems/ruby-2.1.0/gems/savon-2.8.0/lib/savon/operation.rb:51:in `call'
        from /home/vagrant/.rvm/gems/ruby-2.1.0/gems/savon-2.8.0/lib/savon/client.rb:36:in `call'

我的代码是:

代码语言:javascript
运行
复制
require "savon"
require "excon"

Excon.defaults[:ssl_verify_peer] = false

class Payback

  attr_reader :connection, :client, :operation, :message

  SOAP_URL = "https://partnertest.payback.in/PBExternalServices/v1/soap?wsdl"

  def initialize operation, message
    @client = Savon.client(wsdl: "https://partnertest.payback.in/PBExternalServices/v1/soap?wsdl", ssl_verify_mode: :none)
    @operation = operation
    @message = message
  end

  def response
    @response ||= client.call(operation, message: message)
  end

end

这就是我使用它的方式。(,我知道名称空间有问题)

代码语言:javascript
运行
复制
payback = Payback.new :get_account_balance,
                      {"typ:Authentication" => { "typ1:Principal" => { "typ1:PrincipalValue" => 9899012182,
                                                                       "typ1:PrincipalClassifier" => 3 }}}
payback.response

我需要用savon构造这个XML。

代码语言:javascript
运行
复制
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:typ="http://www.payback.net/lmsglobal/ws/v1/extint/types" xmlns:typ1="http://www.payback.net/lmsglobal/xsd/v1/types">
   <soapenv:Header/>
   <soapenv:Body>
      <typ:GetAccountBalanceRequest>
         <typ:Authentication>
            <typ1:Principal>
               <typ1:PrincipalValue>9899012182</typ1:PrincipalValue>
               <typ1:PrincipalClassifier>3</typ1:PrincipalClassifier>
            </typ1:Principal>
         </typ:Authentication>
      </typ:GetAccountBalanceRequest>
   </soapenv:Body>
</soapenv:Envelope>

我不知道我做错了什么,请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-05 10:25:24

我注意到,在WSDL文件的第5820行中,位置如下所示:

代码语言:javascript
运行
复制
<soap:address location="{endpoint address}"/>

会不会是问题所在?

编辑1

  1. 在浏览器中打开:https://partnertest.payback.in/PBExternalServices/v1/soap?wsdl
  2. 搜索页面上的{endpoint address}字符串。

我很难理解这个特定的WSDL文档,但是我想知道是否一定有其他的东西来代替{endpoint address},比如一个真正的URI。例如,会不会是WSDL文档有问题

编辑2

尝试删除服务未识别的typtyp1。最后得到一个返回有效响应的工作代码:

代码语言:javascript
运行
复制
puts Savon.client(
  wsdl: 'https://partnertest.payback.in/PBExternalServices/v1/soap?wsdl',
  endpoint: 'https://partnertest.payback.in/PBExternalServices/v1/soap',
  ssl_verify_mode: :none
).call(
  :get_account_balance,
  :message => {
    'Authentication' => {
      'Principal' => {
        'PrincipalValue' => 9899012182,
        'PrincipalClassifier' => 3
      }
    }
  }
)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27774764

复制
相关文章

相似问题

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