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