1

我正在尝试使用某个供应商 (ExamOne) 的 SOAP API。他们有一个wsdl,我正在尝试使用 Savon (2.2.0) 与他们交互,虽然我正在阅读 Savon 文档,但我看不到如何让 XML 输出与 ExamOne 发送给我的示例请求相匹配。

例如,ExamOne 为根节点标签规定以下内容:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:eos="http://QuestWebServices/EOService">

...但是 Savon 给了我以下信息:

<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="http://QuestWebServices/EOService" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

很抱歉问了这么一个愚蠢的问题,但我发现 Savon 文档完全没有帮助,我迷路了。谁能告诉我如何更正命名空间(“soapenv”而不是“env”)?谁能告诉我如何让根节点具有正确的属性?

TMI:Ruby v 1.9.3,Rails 3.2.13

4

2 回答 2

1

从这个片段开始:

#!ruby
#
gem 'savon', '~> 2.0'
require 'savon'

client = Savon.client(
    wsdl: 'https://wssim.labone.com/services/eoservice.asmx?WSDL',
    env_namespace: :soapenv,
    log: true,
    log_level: :debug,
    pretty_print_xml: true
)

p client.operations

response = client.call(:loop_back)

p response.to_hash
于 2013-08-27T17:07:43.853 回答
0

工作代码:

wsdl = Savon.client(
  wsdl:APP_CONFIG['exam_one']['wsdl'],
  env_namespace:'soapenv',
  namespace_identifier:'eos',
  logger:Logger.new("#{Rails.root}/log/exam_one_or01.log", 1, (2097152*10))
  )
message = {
  :username => APP_CONFIG['exam_one']["username"],
  :password => APP_CONFIG['exam_one']["password"],
  :destinationID => "C1",
  :payload => self.to_s
}
@response = wsdl.call :deliver_exam_one_content, message:message, raise_errors:false

解决方案:

事实证明,问题在于 Savon 由于 400 响应而引发错误,并且由于该错误,它没有记录自己的请求。(我认为糟糕的设计选择。)

raise_errors: false解决方案是在客户端客户端的参数中包含该选项call

为了获得我需要的命名空间,我必须包括:env_namespace:'soapenv', namespace_identifier:'eos'. (我知道,我在最初的问题中没有提到后一个问题,但这就是如何在有效负载中命名项目。)

(+1 史蒂文以获得正确的演示env_namespace。)

于 2013-08-30T00:18:36.137 回答