1

特定のベンダー (ExamOne) の SOAP API を使用しようとしています。それらにはwsdlがあり、Savon (2.2.0) を使用してそれらとやり取りしようとしています。Savon のドキュメントを読んでいますが、ExamOne から送信されたサンプル リクエストと一致する XML 出力を取得する方法がわかりません。

たとえば、ExamOne では、ルート ノード タグについて次のように規定しています。

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

...しかし、サボンは私に次のことを教えてくれます:

<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 のドキュメントはまったく役に立たず、途方に暮れています。名前空間を修正する方法を教えてもらえますか (「env」ではなく「soapenv」)。ルートノードに正しい属性を持たせる方法を誰か教えてもらえますか?

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 応答のためにエラーを発生させ、エラーの結果として、それ自身の要求をログに記録していなかったことでした。(デザインの選択が悪いと思います。)

解決策は、clientclientraise_errors: falseの params にオプションを含めることでした。call

必要な名前空間を取得するには、以下を含める必要がありましたenv_namespace:'soapenv', namespace_identifier:'eos'。(元の質問では後者の問題について言及していませんでしたが、それがペイロード内の項目に名前を付ける方法です。)

( の正しいデモンストレーションのためにスティーブンに +1 env_namespace。)

于 2013-08-30T00:18:36.137 に答える