我正在尝试使用某个供应商的SOAP API(ExamOne)。他们有一个wsdl,我正在尝试使用Savon(2.2.0)与它们进行交互,虽然我正在阅读Savon doc,但我看不出如何让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
答案 0 :(得分: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
答案 1 :(得分: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'
。 (我知道,我在原始问题中没有提到后一个问题,但这是如何在有效负载中命名项目。)
(为了正确演示env_namespace
,史蒂文为+ 1。)