ofbiz的webservice接口提供(3)-不规范的wsdl的客户端访问代码
2016-07-29 00:00
423 查看
针对上个模块提到的ofbiz的wsdl确实不是很规范,那么我们使用axis客户端工具生成的代码肯定不可用,这里我提供了我的客户端调用代码:
注意上边的endpoint的链接要根据你服务器部署的实际情况来书写。
同时我也提供下xmlspy根据链接生成的数据包,这个不可用:
看到上边那个生成的不可用的文件主要是没指定服务方法,我们手工改一下,并将我们的参数值奉上:
看上边只是指定了我们要给哪个方法传送参数“<findSeniorService xmlns="http://ofbiz.apache.org/service/">”
然后发送soap的信息到webservice接口,我这里的返回值如下:
这样我就验证了虽然ofbiz提供的webservice的wsdl很不好用,但是那个webservice接口还是可以使用的。只不过只是支持基础数据类型而已。
import java.util.*; import java.net.*; import java.rmi.*; import javax.xml.namespace.*; import javax.xml.rpc.*; import org.apache.axis.Message; import org.apache.axis.message.RPCElement; import org.apache.axis.message.RPCParam; import org.apache.axis.message.SOAPEnvelope; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class AxisClient { /** * 将我们的消息在控制台System.out打印出来 * */ private static Map getResponseParams(Message respMessage) { Map mRet = new Hashtable(); try { SOAPEnvelope resEnv = respMessage.getSOAPEnvelope(); List bodies = resEnv.getBodyElements(); Iterator i = bodies.iterator(); while (i.hasNext()) { Object o = i.next(); if (o instanceof RPCElement) { RPCElement body = (RPCElement) o; List params = null; params = body.getParams(); Iterator p = params.iterator(); while (p.hasNext()) { RPCParam param = (RPCParam) p.next(); mRet.put(param.getName(), param.getValue()); System.out.println("SOAP Client Param - " + param.getName() + "=" + param.getValue()); } } } } catch (org.apache.axis.AxisFault e) { System.out.println("AxisFault"); } catch (org.xml.sax.SAXException e) { System.out.println("SAXException"); } return mRet; } public static void main(String[] args) { String message = ""; Map output; String endpoint; try { //指明我们的服务点 endpoint = "http://192.168.20.32/projectname/control/SOAPService/"; Call call = (Call) new Service().createCall(); call.setTargetEndpointAddress(new URL(endpoint)); //指明要调用的服务名称 call.setOperationName(new QName("findSeniorService", "findSeniorService")); //指明服务的输出输出参数 call.addParameter("userid", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.INOUT); call.addParameter("salt", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN); call.addParameter("aaa", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.OUT); call.addParameter("bbb", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.OUT); call.addParameter("ccc", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.OUT); call.setReturnType(org.apache.axis.Constants.XSD_STRING); //传递参数,发起调用 Object responseWS = call.invoke(new Object[]{"123456789", "aaa"}); System.out.println( "Receiving response: " + (String) responseWS); output = call.getOutputParams(); getResponseParams(call.getMessageContext().getResponseMessage()); } catch (MalformedURLException ex) { message = "error: wrong url"; } catch (ServiceException ex) { message = "error: failed to create the call"; } catch (RemoteException ex) { ex.printStackTrace(); message = "error: failed to invoke WS"; } finally { System.out.println(""); System.out.println(message); } } }
注意上边的endpoint的链接要根据你服务器部署的实际情况来书写。
同时我也提供下xmlspy根据链接生成的数据包,这个不可用:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <salt xsi:type="xsd:string">String</salt> <userid xsi:type="xsd:string">String</userid> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
看到上边那个生成的不可用的文件主要是没指定服务方法,我们手工改一下,并将我们的参数值奉上:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <SOAP-ENV:Body> <findSeniorService xmlns="http://ofbiz.apache.org/service/"> <salt xsi:type="xsd:string">aaa</salt> <userid xsi:type="xsd:string">2222</userid> </findSeniorService> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
看上边只是指定了我们要给哪个方法传送参数“<findSeniorService xmlns="http://ofbiz.apache.org/service/">”
然后发送soap的信息到webservice接口,我这里的返回值如下:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <soapenv:Body> <ns1:findSeniorServiceResponse xmlns:ns1="http://ofbiz.apache.org/service/"> <aaa xsi:type="xsd:string">test_aaaaa</aaa> <bbb xsi:type="xsd:string">test_bbbbb</bbb> <ccc xsi:type="xsd:string">test_ccccc</ccc> <userid xsi:type="xsd:string">2222</userid> </ns1:findSeniorServiceResponse> </soapenv:Body> </soapenv:Envelope>
这样我就验证了虽然ofbiz提供的webservice的wsdl很不好用,但是那个webservice接口还是可以使用的。只不过只是支持基础数据类型而已。
相关文章推荐
- 在spring的bean中获取ServletContext
- 五种应该避免的代码注释
- godaddy的VDS设置java_opts的位置
- 如何加密/弄乱C源代码
- eclipse上ofbiz项目的断点调试
- Activemq5.2.0的spring开发
- 各种流行的编程风格
- springframework(二)第一个spring程序
- springframework(八)AOP的相关术语以及实现方式介绍
- 持续集成之sonar+eclipse(六)
- springframework(六)AOP之静态代理
- 22条经典的编程引言
- java加解密-数字证书
- C/C++内存问题检查利器—Purify (五)
- 如何在Java中避免equals方法的隐藏陷阱
- C++ 对象的内存布局(下)
- struts2 ognl中计数器的使用
- 6个变态的C语言写的Hello World
- springframework(十四)spring的事务管理
- springframe(七)AOP之动态代理