2016-10-21 1 views
3

암을 무시 savon 몸 네임 스페이스에 의해 작성된 다시 쓰기 -이 클라이언트 변수가 ins0 : 나는 'Savon는 namespace_identifier 속성을하려고

client.call(:ping, soap_header: { "head:HTNGHeader": { "head:From": { "head:Credential": { "head:userName": "******", "head:password":"*****" }}}}, message: {"ns:EchoData": "TestData"}) 

:

client = Savon.client(wsdl: "https://integcert.synxis.com/interface/Contracts/ChannelConnect2004.wsdl", log_level: :debug, log: true, pretty_print_xml: true, env_namespace: :soapenv, namespaces: {"xmlns:soapenv": "http://schemas.xmlsoap.org/soap/envelope/", "xmlns:head": "http://htng.org/1.1/Header/","xmlns:ns": "http://www.opentravel.org/OTA/2003/05"}, convert_request_keys_to: :none, namespace_identifier: "ns", element_form_default: :qualified) 

그리고 오전는 요청을 수행 할 때 이 비누 rq 몸을 가지고있어 :

<soapenv:Body> 
    <ins0:OTA_PingRQ> 
     <ns:EchoData>TestData</ns:EchoData> 
    </ins0:OTA_PingRQ> 
    </soapenv:Body> 

이 ins0 에서왔다?

또한 나는 namespace_identifier: nil 매개 변수를 사용하여 클라이언트를 정의하기 위해 노력하고 이러한 종류의 요청했을 때 :이 비누 RQ 본체를 가지고

client.call(:ping, soap_header: { "head:HTNGHeader": { "head:From": { "head:Credential": { "head:userName": "******", "head:password":"*****" }}}}, message: {"ns:OTA_PingRQ": {"ns:EchoData": "TestData"}}) 

:

<soapenv:Body> 
<OTA_PingRQ> 
    <ns:OTA_PingRQ> 
    <ns:EchoData>TestData</ns:EchoData> 
    </ns:OTA_PingRQ> 
</OTA_PingRQ> 

그리고를 올바른 몸을 가지고 싶습니다 :

<soapenv:Body> 
    <ns:OTA_PingRQ> 
    <ns:EchoData>TestData</ns:EchoData> 
    </ns:OTA_PingRQ> 
</soapenv:Body> 

추가로 중첩 된 OTA_PingRQ 노드를 제거하거나 ins0 네임 스페이스를 사용자 정의로 바꾸는 방법에 대한 아이디어가 있으십니까?

+0

SOAP : envelop을 포함한 완전한 XML을 게시하십시오. 네임 스페이스 접두사 ins0은 SOAP 봉투에서 선언되어 있어야합니다. ins0, ns가 모두 "http://www.opentravel.org/OTA/2003/05"로 정의되어 있으면 요청이 유효합니다. SOAP UI를 사용하여 생성 된 SOAP 요청의 유효성을 검사하고 테스트하는 것이 좋습니다. – sashwat

답변

0

추가 네임 스페이스를 사용하는 아이디어는 논리적으로 정확했지만 Savon은 실제로 사방에 사용하고 싶어하지 않습니다. WSDL에있는 네임 스페이스를 사용하는 것을 선호합니다. element_form_default: :qualifiedelement_form_default: :unqualified을 시도했지만, OTA_PingRQ 노드의 모든 노드에 대해 여전히 ins0을 네임 스페이스로 사용합니다. 나는 그것이 원한다면 ins0 다음 ins0을 사용하자라고 생각했다. 사용할 수있는 네임 스페이스 목록을 살펴본 결과 적절한 네임 스페이스를 찾았습니다. 왜 Savon이 헤더 노드에 대한 네임 스페이스를 자동으로 지정하고 싶지 않으므로 수동으로 ins1으로 지정해야합니다.

client = Savon.client(
    wsdl: "https://integcert.synxis.com/interface/Contracts/ChannelConnect2004.wsdl", 
    log_level: :debug, 
    log: true, 
    pretty_print_xml: true, 
    namespace_identifier: :ins0, 
    element_form_default: :qualified, 
    soap_header: { 
    "ins1:HTNGHeader": { 
     "ins1:From": { 
     "ins1:Credential": { 
      "ins1:userName": "******", 
      "ins1:password":"*****" 
     } 
     } 
    } 
    } 
) 

client.call(:ping, message: {"EchoData": "TestData"}) 

요청 :

<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ins0="http://www.opentravel.org/OTA/2003/05" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ins1="http://htng.org/1.1/Header/"> 
    <env:Header> 
    <ins1:HTNGHeader> 
     <ins1:From> 
     <ins1:Credential> 
      <ins1:userName>******</ins1:userName> 
      <ins1:password>*****</ins1:password> 
     </ins1:Credential> 
     </ins1:From> 
    </ins1:HTNGHeader> 
    </env:Header> 
    <env:Body> 
    <ins0:OTA_PingRQ> 
     <ins0:echoData>TestData</ins0:echoData> 
    </ins0:OTA_PingRQ> 
    </env:Body> 
</env:Envelope> 

응답 :

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <OTA_PingRS xmlns="http://www.opentravel.org/OTA/2003/05" PrimaryLangID="en"> 
     <Errors> 
     <Error Type="4" ShortText="Login failed"/> 
     </Errors> 
     <EchoData/> 
    </OTA_PingRS> 
    </soap:Body> 
</soap:Envelope> 

편집 : 클라이언트 구성에 soap_header 제공이 있기 때문에보다 효율적으로 여기

구성의 버전을하고있다 .