与Savon一起迷失(针对SOAP请求)

时间:2013-08-26 21:20:19

标签: soap wsdl savon

我正在尝试使用某个供应商的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

2 个答案:

答案 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。)