2014-01-10 5 views
1

WSDL 파일을 기반으로 특정 SOAP 요청 메시지를 작성해야합니다. SOAP UI를 사용하여 WSDL에서 SOAP 요청을 만듭니다.특정 SOAP 요청에 대해 WSDL을 생성하십시오.

SOAP 요청은 다음과 같아야합니다

<?xml version="1.0"?> 
<SOAP-ENV:Envelope 
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
SOAP-ENV:encodingstyle="http://schemas.xmlsoap.org/soap/encoding/"> 
<SOAP-ENV:Header> 
    <username>xxxx</username> 
    <password>xxxx</password> 
    <MaxOrders>1</MaxOrders> 
    <xmlVers>1</xmlVers> 
</SOAP-ENV:Header> 
<SOAP-ENV:Body> 
    <m:getNewOrders xmlns:m= "urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/"> 
    </m:getNewOrders> 
</SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

나는 다음과 WSDL있다 : SOAP 요청 메시지가 보이는 난 그 WSDL을 가지고 SOAP의 UI에서 가져올 때

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions 
xmlns:m="https://xxx.yyy.co.uk/b2b/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
name="xxxOrders" 
targetNamespace="https://xxx.yyy.co.uk/b2b/"> 
<wsdl:types> 
<xsd:schema targetNamespace="https://xxx.yyy.co.uk/b2b/"> 
    <xsd:element name="Envelope"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Header"/> 
     <xsd:element name="Body"/> 
     </xsd:sequence> 
     <xsd:attribute name="encodingstyle" type="xsd:anyURI" form="qualified" use="required" /> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="Header"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="username" type="xsd:NCName" form="unqualified" /> 
     <xsd:element name="password" type="xsd:integer" form="unqualified" /> 
     <xsd:element name="MaxOrders" type="xsd:integer" form="unqualified" /> 
     <xsd:element name="xmlVers" type="xsd:integer" form="unqualified" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="Body"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element ref="m:getNewOrders" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="getNewOrders"> 
    <xsd:complexType /> 
    </xsd:element> 
</xsd:schema> 
    </wsdl:types> 

    <wsdl:message name="getNewOrders"> 
    <wsdl:part element="m:getNewOrders" name="parameters"/> 
    </wsdl:message> 


    <wsdl:portType name="xxxOrders"> 
    <wsdl:operation name="getNewOrders"> 
     <wsdl:input message="m:getNewOrders"/> 
    </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="xxxOrdersSOAP" type="m:xxxOrders"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="getNewOrders"> 
     <soap:operation soapAction="urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="xxxOrders"> 
    <wsdl:port binding="m:xxxOrdersSOAP" name="xxxOrdersSOAP"> 
     <soap:address location="https://xxx.yyy.co.uk/b2b/soap/soap_orders.asp"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

을하지만, 다른 내가 기대 :

<soapenv:Envelope 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:b2b="https://xxx.yyy.co.uk/b2b/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <b2b:getNewOrders/> 
    </soapenv:Body> 
</soapenv:Envelope> 

Header 요소가 비어 f를 또는 예입니다. getNewOrders 나는 xmlns:b2b에 바인딩되어 있으므로 괜찮다고 생각하므로 getNewOrders 요소에 네임 스페이스가 필요하지 않습니다. 나 맞아?

누군가 내가 WSDL에서 수정해야 할 사항을 지적 해주십시오. 나는 길을 잃었다.

+0

'https : // b2bqa.shoprite.co.za/b2b /'가'https : // xxx.yyy.co.uk/b2b /'와 동일하다는 것을 의미합니까? –

+0

@ 존 : 고마워. 예, 죄송합니다. 편집했습니다. – Peter

답변

1

네임 스페이스가 정상이지만 문제는 헤더 부분을 정의하지 않았다는 것입니다. 자, 만약 당신이 그것을하더라도, 당신의 도구가 고려 될지 모르겠지만 ... 분명히, 인터페이스 정의 측면에서 이것은 당신이해야만하는 일입니다.

"wsdl soap header example"또는 비슷하게 검색하면 this one과 같이 많은 조회수가 표시됩니다.

핵심 포인트는

  • 사용자의 입력 부분은 헤더와 관련된 부분을 정의해야합니다.
    <wsdl:message name="getNewOrders"> 
        <wsdl:part element="m:getNewOrders" name="parameters"/> 
        <wsdl:part element="m:Header" name="header"/> 
    </wsdl:message> 
    
    당신이 지금 SOAP 헤더
<wsdl:operation name="getNewOrders"> 
    <soap:operation soapAction="urn:https://xxx.yyy.co.uk/b2b/soap/soap:getNewOrders/"/> 
<wsdl:input name="getNewOrders"> 
    <wsdlsoap:header message="getNewOrders" part="header" use="literal"/> 
    <wsdlsoap:body use="literal" parts="parameters"/> 
</wsdl:input> 
    <wsdl:output> 
    <soap:body use="literal"/> 
    </wsdl:output> 
</wsdl:operation> 

에 해당 헤더 부분을 결합 할 필요가, 당신은 (접두사를 확인하지 않은 WSD의 targetNamespace와 일치하는 기본 네임 스페이스가 있어야합니다. 위의 접두사없이 작동하려면 위의 L) 당신을 위해 WSDL을 다시 작성하려고 시도하지 않았지만 ... 이것은 기본적으로 헤더를 지정하는 방법입니다. 사용자의 입력에는 SOAP에서 헤더에있는 여러 부분이 있고 다른 몸에.

+0

감사합니다, Petru Gardea, 지금은 잘 작동합니다. 한 가지 이상한 점은 접두어 "soapenv"또는 "SOAP-ENV"를 사용하면 웹 서비스 서버에 문제가되는 것입니다. "SOAP-ENV"만 허용합니다. 하지만 XSLT로이 문제를 해결할 것입니다. 안부, 피터 – Peter

+0

@ 피터, 실제로 이상한 ... 다른 접두사가 동일한 네임 스페이스 (URI)에 바인딩되어있는 한, 접두사 (별칭)의 선택은 네임 스페이스 인식 모든 괜찮은 XML 파서에 중요하지 않아야합니다. –

+0

서비스가 어떤 접두사를 사용하는지 신경 쓰면 심각하게 손상됩니다. 귀하의 회사는 10 년 이상 동안 유지되어 온 간단한 산업 표준을 따르는 데 방해가 될 수없는 다른 회사와 거래하는 것을 피해야합니다. –

관련 문제