以前使用webservice服务都很简单,就是根据提供的wsdl接口地址,通过eclipse或者idea自动生成webservice client包,然后直接调用就可以了。这次业务提供的wsdl是需要验证soapheader的,而且通过IDE工具无法生成可以直接调用的类包,无奈只能通过其他办法来实现,通过百度,可以使用axis包来实现,具体实现过程如下:
1、需要的jar包依赖
<dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>javax.xml.rpc</groupId> <artifactId>javax.xml.rpc-api</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.geronimo.bundles</groupId> <artifactId>commons-discovery</artifactId> <version>0.4_1</version> </dependency> <dependency> <groupId>wsdl4j</groupId> <artifactId>wsdl4j</artifactId> <version>1.6.3</version> </dependency>
2、WSDL接口文档
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://tempuri.org/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> <s:element name="SendXMLFile"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="xmlProjectData" type="s:base64Binary"/> <s:element minOccurs="0" maxOccurs="1" name="reportDate" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="SendXMLFileResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="SendXMLFileResult" type="s:string"/> </s:sequence> </s:complexType> </s:element> <s:element name="UserSoapHeader" type="tns:UserSoapHeader"/> <s:complexType name="UserSoapHeader"> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="UserId" type="s:string"/> <s:element minOccurs="0" maxOccurs="1" name="PassWord" type="s:string"/> </s:sequence> <s:anyAttribute/> </s:complexType> </s:schema> </wsdl:types> <wsdl:message name="SendXMLFileSoapIn"> <wsdl:part name="parameters" element="tns:SendXMLFile"/> </wsdl:message> <wsdl:message name="SendXMLFileSoapOut"> <wsdl:part name="parameters" element="tns:SendXMLFileResponse"/> </wsdl:message> <wsdl:message name="SendXMLFileUserSoapHeader"> <wsdl:part name="UserSoapHeader" element="tns:UserSoapHeader"/> </wsdl:message> <wsdl:portType name="DataReportServiceSoap"> <wsdl:operation name="SendXMLFile"> <wsdl:input message="tns:SendXMLFileSoapIn"/> <wsdl:output message="tns:SendXMLFileSoapOut"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DataReportServiceSoap" type="tns:DataReportServiceSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="SendXMLFile"> <soap:operation soapAction="http://tempuri.org/SendXMLFile" style="document"/> <wsdl:input> <soap:body use="literal"/> <soap:header message="tns:SendXMLFileUserSoapHeader" part="UserSoapHeader" use="literal"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="DataReportServiceSoap12" type="tns:DataReportServiceSoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="SendXMLFile"> <soap12:operation soapAction="http://tempuri.org/SendXMLFile" style="document"/> <wsdl:input> <soap12:body use="literal"/> <soap12:header message="tns:SendXMLFileUserSoapHeader" part="UserSoapHeader" use="literal"/> </wsdl:input> <wsdl:output> <soap12:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DataReportService"> <wsdl:port name="DataReportServiceSoap" binding="tns:DataReportServiceSoap"> <soap:address location="http://221.226.63.54:8187/DataReportService.asmx"/> </wsdl:port> <wsdl:port name="DataReportServiceSoap12" binding="tns:DataReportServiceSoap12"> <soap12:address location="http://221.226.63.54:8187/DataReportService.asmx"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
3、接口调用代码
public static void sendReportTest(byte[] reportData, String date){ try { // 服务端的url,需要根据情况更改。 String endpointURL = URL; Service service = new Service(); Call call = (Call) service.createCall(); call.setTimeout(new Integer(60000)); call.setTargetEndpointAddress(new URL(endpointURL)); call.setSOAPActionURI("http://tempuri.org/SendXMLFile"); call.setOperationName(new QName("http://tempuri.org/","SendXMLFile"));// 设置操作的名称。 // 由于需要认证,故需要设置调用的用户名和密码。 SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("http://tempuri.org/", "UserSoapHeader"); soapHeaderElement.setNamespaceURI("http://tempuri.org/"); try { soapHeaderElement.addChildElement("UserId").setValue(USER_ID); soapHeaderElement.addChildElement("PassWord").setValue(PASSWORD); } catch (SOAPException e) { e.printStackTrace(); } call.addHeader(soapHeaderElement); call.setReturnType(XMLType.XSD_STRING);// 返回的数据类型 call.addParameter(new QName("http://tempuri.org/","xmlProjectData"), XMLType.XSD_BASE64, ParameterMode.IN);// 参数的类型 call.addParameter(new QName("http://tempuri.org/","reportDate"), XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型 String result = (String) call.invoke(new Object[]{reportData,date});// 执行调用 // 结果信息解析 Document document = DocumentHelper.parseText(result); Element rootElement = document.getRootElement(); Iterator iter = rootElement.elementIterator("State"); while(iter.hasNext()){ Element recordEle = (Element) iter.next(); String code = recordEle.getTextTrim();// State值 if("0".equals(code)){ //成功 Logger.getRootLogger().error("调用接口成功"); }else{ // 失败保存log Logger.getRootLogger().error(result); } } } catch (Exception e) { Logger.getRootLogger().error("调用接口失败",e); } }