2013-08-26 2 views
1

특정 공급 업체 (ExamOne)의 SOAP API로 작업하려고합니다. 그들은 wsdl을 가지고 있으며, Savon (2.2.0)을 인터페이스로 사용하려고합니다. Savon의 문서를 읽지 만 ExamOne이 보낸 샘플 요청과 일치하도록 XML 출력을 얻는 방법을 볼 수 없습니다. 예를 들어Savon과 잃어버린 SOAP 요청 (SOAP 요청)

는 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 문서를 전혀 도움이되지 않는다고 안다. 그리고 나는 길을 잃는다. 아무도 네임 스페이스 ('env'대신 'soapenv')를 수정하는 방법을 알려 줄 수 있습니까? 누구든지 루트 노드에 올바른 속성을 부여하는 방법을 알려 줄 수 있습니까?

TMI : 루비 V 1.9.3이 조각과 3.2.13

답변

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 응답으로 인해 오류를 발생시키고 오류의 결과로 자체 요청을 로깅하지 않았 음이 밝혀졌습니다. (디자인 선택이 잘못되었다고 생각합니다.)

해결책은 클라이언트 클라이언트의 call에 대한 매개 변수에 raise_errors: false 옵션을 포함하는 것이 었습니다.

필요한 네임 스페이스를 얻으려면 다음을 포함시켜야합니다. env_namespace:'soapenv', namespace_identifier:'eos'. (난 내 원래의 질문에 후자의 문제를 언급하지 않았다, 알고 있지만, 그 페이로드에 항목을 네임 스페이스하는 방법은 다음과 같습니다.)

(env_namespace의 올바른 시연 스티븐 +1.)

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