项目中有这样一个需求,调用运营商接口,给用户充值流量。但是接口地址是wsdl形式的。之前只是在.net开发的时候用WCF调用过接口。那么java如何实现调用wsdl形式的webservice呢?
网上有许多类似的问题,也有一些解决方法,有的说用了XFire解决了,有的说用了AXIS。于是我采用了第二种。
/** * description:调用运营商充值接口方法 * author:xuxiaoguai * 2015-12-1 10:32:04 * @return 返回值参数代码 */ public String invokeRemoteFuc() { String endpoint="http://^^^^"; String result="no result!"; System.out.println(result); Service service =new Service(); Call call; Object[] object=new Object[4]; //Object用来存储方法的参数 object[0]="XXX"; //相应的参数,由于保密 object[1]="XXX"; object[2]="XXX"; object[3]="10M"; try { call=(Call)service.createCall(); call.setTargetEndpointAddress(endpoint); //远程调用路径 call.setOperationName("methodname"); //调用的方法名 //设置参数名: call.addParameter("XX", //参数名 XMLType.XSD_STRING,//参数类型:String ParameterMode.IN); //参数模式:'IN' or 'OUT' call.addParameter("XX", XMLType.XSD_STRING,ParameterMode.INOUT); call.addParameter("XX", XMLType.XSD_STRING,ParameterMode.INOUT); call.addParameter("XX", XMLType.XSD_STRING,ParameterMode.INOUT); //设置返回值类型: call.setReturnType(XMLType.XSD_STRING); //返回值类型:String result=(String) call.invoke(object); //远程调用 }catch (ServiceException e) { e.printStackTrace(); }catch (RemoteException e){ e.printStackTrace(); } return result; } //测试充值接口方法-xuxiaoguai-2015年11月30日17:13:04 public static void main(String[] args){ BusinessController t=new BusinessController(); String result =t.invokeRemoteFuc(); System.out.println(result); }代码说明:由于接口和参数很重要,不能外漏,所以小编用了XX代替,在object数组中是对应参数的值,在
call.addParameter("XX", XMLType.XSD_STRING,ParameterMode.INOUT);中对应的XX是指接口参数名称,我们还是分清一些的好。
AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: org.xml.sax.SAXException: Bad envelope tag: definitions faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXException: Bad envelope tag: definitions at org.apache.axis.message.EnvelopeBuilder.startElement(EnvelopeBuilder.java:71) at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:379) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:605) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3138) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at org.apache.axis.client.Call.invoke(Call.java:1812) at com.demo.controller.business.BusinessController.invokeRemoteFuc(BusinessController.java:107) at com.demo.controller.business.BusinessController.main(BusinessController.java:120) {http://xml.apache.org/axis/}hostname:aa-PC org.xml.sax.SAXException: Bad envelope tag: definitions at org.apache.axis.AxisFault.makeFault(AxisFault.java:101) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:701) at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62) at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206) at org.apache.axis.client.Call.invokeEngine(Call.java:2784) at org.apache.axis.client.Call.invoke(Call.java:2767) at org.apache.axis.client.Call.invoke(Call.java:2443) at org.apache.axis.client.Call.invoke(Call.java:2366) at org.apache.axis.client.Call.invoke(Call.java:1812) at com.demo.controller.business.BusinessController.invokeRemoteFuc(BusinessController.java:107) at com.demo.controller.business.BusinessController.main(BusinessController.java:120) Caused by: org.xml.sax.SAXException: Bad envelope tag: definitions at org.apache.axis.message.EnvelopeBuilder.startElement(EnvelopeBuilder.java:71) at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1048) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:379) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:605) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3138) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333) at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) ... 10 more
中间还会报一些其他的错误,也就是参数不对应等参数错误了……
这种方式是直接直接AXIS调用远程的web service ,还有直接SOAP调用远程的webservice 的方法,还有使用wsdl2java把WSDL文件转成本地类,然后像本地类一样使用,但是后两种方法小编还没有尝试。