与Savon一起丢失(用于SOAP请求)

与Savon一起丢失(用于SOAP请求),soap,wsdl,savon,Soap,Wsdl,Savon,我正在尝试使用某个供应商(ExamOne)的SOAP API。他们有一个接口,我正在尝试使用Savon(2.2.0)与他们接口,尽管我正在阅读Savon文档,但我看不到如何获得XML输出以匹配ExamOne发送给我的示例请求 例如,ExamOne为根节点标记规定了以下内容: …但Savon给了我以下信息: 我很抱歉问这样一个愚蠢的问题,但我发现Savon文档完全没有帮助,我迷路了。谁能告诉我如何更正名称空间('soapenv'而不是'env')?谁能告诉我如何使根节点具有正确的属性 TMI:

我正在尝试使用某个供应商(ExamOne)的SOAP API。他们有一个接口,我正在尝试使用Savon(2.2.0)与他们接口,尽管我正在阅读Savon文档,但我看不到如何获得XML输出以匹配ExamOne发送给我的示例请求

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

…但Savon给了我以下信息:

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


TMI:Ruby v 1.9.3,Rails 3.2.13

从以下片段开始:

#!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

从以下代码段开始:

#!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

工作代码:

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
解决方案:

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响应而引发了一个错误,并且作为错误的结果,它没有记录自己的请求。(我认为,糟糕的设计选择。)

解决方案是在clientclient上的
call
参数中包含选项
raise\u errors:false

为了获得所需的名称空间,我必须包括:
env\u名称空间:'soapenv',名称空间标识符:'eos'
。(我知道,我在最初的问题中没有提到后一个问题,但这就是如何在有效负载中命名项的名称空间。)


(+1给Steven,以正确演示
env_名称空间

工作代码:

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
解决方案:

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响应而引发了一个错误,并且作为错误的结果,它没有记录自己的请求。(我认为,糟糕的设计选择。)

解决方案是在clientclient上的
call
参数中包含选项
raise\u errors:false

为了获得所需的名称空间,我必须包括:
env\u名称空间:'soapenv',名称空间标识符:'eos'
。(我知道,我在最初的问题中没有提到后一个问题,但这就是如何在有效负载中命名项的名称空间。)

(+1至Steven,以正确演示
env_名称空间