java - 将文件发送到安全的 SOAP Web 服务

标签 java web-services soap apache-httpclient-4.x apache-httpcomponents

我需要编写一个调用 SOAP Web 服务的客户端。我收到了 wsdlSOAP 请求。它是一个安全的 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 的框架,如 AxisCXF并遵循自上而下的方法。

这些框架提供的工具将帮助您从 WSDL 开始生成正确的 Java 客户端类。

如果您想使用 HTTP 客户端,则必须使用 java.xml.soap 中的类自行处理 SOAP 信封。请参阅SOAPMessage

关于java - 将文件发送到安全的 SOAP Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678871/

相关文章:

php - Aterisk/Freeswitch 通过 Web 应用程序生成 SIP 用户

java - 如何获取应用了补丁的 openjdk-8-jdk 的源代码?

java - 内部对象更改时 HashSet 的哈希解决方法

linux - Delphi 创建的 Soap 服务器应用程序可以在 Linux 上运行吗?

web-services - 我们如何在 OpenTest 中进行采用 formdata 而不是 json 的 POST 服务调用?

c# - WS 调用中空参数和省略参数之间的区别?

javascript - 是否可以使用 jQuery xml 处理程序解析 SOAP 响应?

java - 膨胀自定义 Android 小部件

java - 如何使用 IJavaProject#findType() 获取java项目中的所有方法?

有响应时 PHP SoapClient 故障