1

我需要編寫一個調用SOAP Web服務的客戶端。我得到wsdlSOAP request。這是一個安全的Web服務,作爲附件的文件傳遞給服務。我使用SOAP UI進行了測試,但需要編寫一個Java程序來調用服務。將文件發送到安全的SOAP Web服務

這裏是WSDL

<definitions xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/integration/b2b" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" name="WS_VT_SECURED_INBOUND" targetNamespace="http://xmlns.oracle.com/integration/b2b"> 
<types> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/integration/b2b"> 
<element name="TransportFileRequest"> 
<complexType> 
<sequence> 
<element minOccurs="1" name="FileName" type="string"/> 
<element minOccurs="1" name="FileType" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="messageID" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="senderID" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="checksum" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="timestamp" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="transportVersion" type="string"/> 
<element maxOccurs="1" minOccurs="1" name="payload" type="anyType"/> 
</sequence> 
</complexType> 
</element> 
<element name="TransportFileResponse"> 
<complexType> 
<sequence> 
<element maxOccurs="1" minOccurs="1" name="Status" type="string"/> 
<element maxOccurs="unbounded" minOccurs="0" name="ErrorMessage" type="string"/> 
</sequence> 
</complexType> 
</element> 
<element name="error" type="string"/> 
</schema> 
</types> 
<message name="TransportFileResponseMessage"> 
<part name="FileTransportResponse" element="tns:TransportFileResponse"></part> 
</message> 
<message name="faultMessage"> 
<part name="faultMessage" element="tns:error"></part> 
</message> 
<message name="TransportFileRequestMessage"> 
<part name="FileTransportRequest" element="tns:TransportFileRequest"></part> 
</message> 
<portType name="TransportFilePort"> 
<operation name="sendFile"> 
<input message="tns:TransportFileRequestMessage"></input> 
<output message="tns:TransportFileResponseMessage"></output> 
<fault name="faultMessage" message="tns:faultMessage"></fault> 
</operation> 
</portType> 
<binding name="TransportFilePortBinding" type="tns:TransportFilePort"> 
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
<operation name="sendFile"> 
<soap:operation soapAction="sendFile" style="document"/> 
<input> 
<soap:body use="literal"/> 
</input> 
<output> 
<soap:body use="literal"/> 
</output> 
<fault name="faultMessage"> 
<soap:fault name="faultMessage" use="literal"/> 
</fault> 
</operation> 
</binding> 
<service name="receiveFile_WS_VT_SECURED_INBOUND"> 
<port name="TransportFilePort_pt" binding="tns:TransportFilePortBinding"> 
<soap:address location="https://hostname:9443/wsx/services/receiveFile_WS_VT_SECURED_INBOUND"/> 
</port> 
</service> 
</definitions> 

這是SOAP請求看起來像

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:b2b="http://xmlns.oracle.com/integration/b2b"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <b2b:TransportFileRequest> 
      <b2b:FileName>120_VERMONT_ACH_Sanity11march1.dat</b2b:FileName> 
     <b2b:FileType>120</b2b:FileType> 
     <b2b:MessageID>3454</b2b:MessageID> 
     <b2b:SenderID>ekrjekrj</b2b:SenderID> 
     <b2b:checksum>b2ee8af554ab6933085d341b71765bc8</b2b:checksum> 
     <b2b:timestamp>3434</b2b:timestamp> 
     <b2b:transportServiceVersion>4343</b2b:transportServiceVersion> 
     <b2b:payload>120_VERMONT_ACH_Sanity11march1.dat</b2b:payload> 
     </b2b:TransportFileRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

在上面,文件附件是

<b2b:payload>120_VERMONT_ACH_Sanity11march1.dat</b2b:payload> 

我知道可以有多個如何使用apache http client庫或任何其他的方法來做到這一點。但是我從來沒有使用過Web服務,所以對此不太瞭解。即使我已經開始使用Apache HTTP客戶端,但無法做到這一點。對於Apache的問題,我發佈了一個問題Sending file to secured SOAP web service using apache http client,但目前還沒有提供任何解決方案。 使用apache http客戶端沒有必要實現相同的強制。

請讓我知道我該怎麼做?

回答

0

使用符合JAX-WS的框架,如AxisCXF,並遵循自上而下的方法。

這些框架提供的工具將幫助您從WSDL開始生成適當的Java客戶端類。

如果您想使用HTTP客戶端,則必須使用java.xml.soap中的類自己處理SOAP信封。見SOAPMessage