理解本文之前需要了解以下几个东西:
ofbiz的服务定义和实现,webservice的含义和简单理解wsdl文件,soapui的简单使用
1.首先定义一个服务,并且在服务定义中增加一个export为true的属性,这样这个服务就暴露成webservice了
<service engine="java" name="TestSoap" location="com.sunyard.cpsp.ofbiztemplate.OfbizTemplateService" invoke="testSoap" export="true"> <description>这是一个暴露成webservice的服务,java实现中有利用soapui测试的详细介绍</description> <attribute name="attr1" mode="INOUT" type="String"></attribute> <attribute name="attr2" mode="INOUT" type="Map"></attribute> <attribute name="attr3" mode="INOUT" type="Double"></attribute> </service>
2.写好这个服务的实现,我们这里采用的是java
public static Map<String, Object> testSoap(DispatchContext dctx,Map<String, Object> context){ /**介绍如何结合soapui测试这个服务*/ /* * 1.浏览器中输入http://localhost:8080/webtools/control/SOAPService?wsdl可以查看所有ofbiz暴露成webservice的服务 * 2.选择TestSoap浏览器地址跳转到http://localhost:8080/webtools/control/SOAPService/TestSoap?wsdl这就是TestSoap的 * wsdl文件 * 3.在soapui中建立一个工程initil WSDL填上第二点中的wsdl文件(可以直接填这个地址) * 4.soapui中的第一个request中填入合法的参数数据,详情参考http://meilv.iteye.com/blog/1317112 */ Map<String, Object> result = ServiceUtil.returnSuccess("成功运行TestSoap服务"); result.putAll(context); return result; }
3.按照服务实现中注释查看ofbiz为每个服务生产的wsdl文件
为什么地址是webtools模块下面的地址?那是因为在webtools的control中有下面这样一个request,所以使用这样一个地址来暴露webservice。因为这个request中的event类型是soap,所以control中一定要引用了soap这个handler
<request-map uri="SOAPService"> <event type="soap"/> <response name="error" type="none"/> <response name="success" type="none"/> </request-map>
4.soapui的request中的数据格式如下。实际上就是将context中的内容用xml表示了出来。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ofbiz.apache.org/service/"> <soapenv:Header/> <soapenv:Body> <ser:TestSoap> <map-Map> <!-- Map中的一个元素,其中key为String类型,value也为String类型--> <ser:map-Entry> <ser:map-Key> <ser:std-String value="attr1"/> </ser:map-Key> <ser:map-Value> <ser:std-String value="attr1"/> </ser:map-Value> </ser:map-Entry> <!-- Map中的一个元素,其中key为String类型,value也为Map类型--> <ser:map-Entry> <ser:map-Key> <ser:std-String value="attr2"/> </ser:map-Key> <ser:map-Value> <ser:map-Map> <ser:map-Entry> <ser:map-Key> <ser:std-String value="attr21"/> </ser:map-Key> <ser:map-Value> <ser:std-String value="attr21"/> </ser:map-Value> </ser:map-Entry> </ser:map-Map> </ser:map-Value> </ser:map-Entry> <!-- Map中的一个元素,其中key为String类型,value也为Double类型--> <ser:map-Entry> <ser:map-Key> <ser:std-String value="attr3"/> </ser:map-Key> <ser:map-Value> <ser:std-Double value="20"/> </ser:map-Value> </ser:map-Entry> </map-Map> </ser:TestSoap> </soapenv:Body> </soapenv:Envelope>