我需要编写一个调用 SOAP Web 服务的客户端。我收到了 wsdl
和 SOAP 请求
。它是一个安全的 Web 服务,并且一个文件作为附件传递给该服务。我已经使用 SOAP UI
对其进行了测试,但需要编写一个 Java 程序来调用该服务。
这是 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 客户端
库或任何其他库。但我从未使用过 Web 服务,所以对此了解不多。尽管我已经开始使用 apache http 客户端但无法做到这一点。对于 apache 问题,我发布了一个问题 Sending file to secured SOAP web service using apache http client但目前还没有提供解决方案。
没有强制要求必须使用 apache http 客户端来实现相同的目的。
请让我知道我该怎么做?
最佳答案
使用符合 JAX-WS 的框架,如 Axis或CXF并遵循自上而下的方法。
这些框架提供的工具将帮助您从 WSDL 开始生成正确的 Java 客户端类。
如果您想使用 HTTP 客户端,则必须使用 java.xml.soap
中的类自行处理 SOAP 信封。请参阅SOAPMessage
关于java - 将文件发送到安全的 SOAP Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678871/