ofbiz webservice 例解
1、定义controller.xml文件,controller文件:ofbiz当前项目的所有请求的入口,通过对应request-map:将所有的请求uri对应到指定的处理函数上。
<request-map uri="httpService"> <event type="java" path="org.ofbiz.service.engine.HttpEngine" invoke="httpEngine"/> <response name="success" type="none"/> <response name="error" type="none"/> </request-map> <request-map uri="ExamWebService"> <event type="soap"/> <response name="error" type="none"/> <response name="success" type="none"/> </request-map> <request-map uri="xmlrpc" track-serverhit="false" track-visit="false"> <event type="xmlrpc"/> <response name="error" type="none"/> <response name="success" type="none"/> </request-map>
通过在controller.xml文件上的支持,才能将httpService,SOAPService,xmlrpc这些服务对外提供
2、定义ofbiz的service(servicedef下面的server.xml):这个是ofbiz赖以骄傲的设计方式。她可以将所有内部实体对象的CRUD都使用service的方式提供,不同系统之间可以通过互相调用service来完成业务操作。如果想将ofbiz的某个服务开放成webservice只需要将我们定义service文件中的service属性中的export设定为true即可。
<service name="findAllOrderPlanList" engine="java" location="org.eheluo.ecloud.service.webService.WebService" invoke="findAllOrderPlanList" export="true" auth="false"> <attribute name="examKsZqs" mode="IN" type="String" optional="false" /> <attribute name="result" mode="OUT" type="String" /> </service>
上面代码表示:将:org.eheluo.ecloud.service.webService.WebService类中的findAllOrderPlanList作为soap接口提供出去。attribute的mode属性:IN表示输入参数,OUT表示输出参数,INOUT表示输入输出同用。如果auth="true",则必须做用户验证,否则会报错:org.ofbiz.service.ServiceAuthException: User authorization is required for this service: findAllOrderPlanList
3、实际业务类:(注意:入参和出参都是map类型)
public class WebService extends BaseService { public static Map<String, Object> findAllOrderPlanList(DispatchContext dc, Map<String, ? extends Object> context) throws ServiceAuthException { Delegator delegator = dc.getDelegator(); List<EntityCondition> ec = FastList.newInstance(); String examKsZqs= (String) context.get("examKsZqs"); if(examKsZqs != null && !"".equals(examKsZqs)){ ec.add(EntityCondition.makeCondition("examKsZqs", EntityOperator.EQUALS, Integer.valueOf(examKsZqs))); } Map<String, Object> map = findAll(delegator, "OrderPlan", ec.size() > 0 ? EntityCondition.makeCondition(ec, EntityOperator.AND) : null, UtilMisc.toList("examKsZqs DESC"),dc,context); List<GenericValue> orderList = (List<GenericValue>) map.get("modellist"); JSONArray jsonArray = new JSONArray(); if (orderList != null && orderList.size() > 0) { for (GenericValue gv : orderList) { JSONObject jsonObject = new JSONObject(); jsonObject.put("guid", gv.getString("guid")); jsonObject.put("examKsZqs", gv.getInteger("examKsZqs")); jsonObject.put("bmbName", gv.getString("bmbName")); jsonArray.add(jsonObject); } } Map<String, Object> resultMap = new HashMap<String, Object>(); resultMap.put("result", jsonArray.toString()); return resultMap; } }
通过这三步就可以对外发布服务了,wsdl的访问方式:http://localhost:8080/ecloud/control/ExamWebService?wsdl
访问结果:
点击方法名得到结果:
类似这样的结果,则表示webservice发布成功。
4、测试:
(1):SOAPWebService
1):java测试
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
String endpoint = "http://localhost:8080/ecloud/control/ExamWebService";
String tempuri = "http://ofbiz.apache.org/service/";
OMFactory fac = OMAbstractFactory.getOMFactory(); OMNamespace omNs = fac.createOMNamespace(tempuri, ""); ServiceClient sc = new ServiceClient(); Options opts = new Options(); opts.setTo(new EndpointReference(endpoint)); opts.setAction("findAllOrderPlanList"); sc.setOptions(opts); OMElement method = fac.createOMElement("findAllOrderPlanList", omNs); OMElement parameters = fac.createOMElement("map-Map", omNs); parameters.addChild(createMapEntry(fac, omNs, "login.username", "admin")); parameters.addChild(createMapEntry(fac, omNs, "login.password", "ofbiz")); parameters.addChild(createMapEntry(fac, omNs, "examKsZqs", examKsZqs)); method.addChild(parameters); OMElement res = sc.sendReceive(method); System.out.println(res);
private static OMElement createMapEntry(OMFactory fac, OMNamespace omNs, String key, String val) { OMElement mapEntry = fac.createOMElement("map-Entry", omNs); // create the key OMElement mapKey = fac.createOMElement("map-Key", omNs); OMElement keyElement = fac.createOMElement("std-String", omNs); OMAttribute keyAttribute = fac.createOMAttribute("value", null, key); mapKey.addChild(keyElement); keyElement.addAttribute(keyAttribute); // create the value OMElement mapValue = fac.createOMElement("map-Value", omNs); OMElement valElement = fac.createOMElement("std-String", omNs); OMAttribute valAttribute = fac.createOMAttribute("value", null, val); mapValue.addChild(valElement); valElement.addAttribute(valAttribute); // attach to map-Entry mapEntry.addChild(mapKey); mapEntry.addChild(mapValue); return mapEntry; }
得到结果:
2):Postman测试
<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> <findAllOrderPlanList xmlns="http://ofbiz.apache.org/service/"> <map-Map> <map-Entry> <map-Key> <std-String value="login.username"></std-String> </map-Key> <map-Value> <std-String value="admin"></std-String> </map-Value> </map-Entry> <map-Entry> <map-Key> <std-String value="login.password"></std-String> </map-Key> <map-Value> <std-String value="ofbiz"></std-String> </map-Value> </map-Entry> <map-Entry> <map-Key> <std-String value="examKsZqs"></std-String> </map-Key> <map-Value> <std-String value=""></std-String> </map-Value> </map-Entry> </map-Map> </findAllOrderPlanList> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
得到结果:
(2):xmlrpc
java测试:
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
String endpoint = "http://localhost:8080/ecloud/control/xmlrpc"; XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl(); config.setServerURL(new URL(endpoint)); config.setEnabledForExceptions(true); config.setEnabledForExtensions(true); XmlRpcClient client = new XmlRpcClient(); client.setConfig(config); Map paramMap = new HashMap(); paramMap.put("examKsZqs", examKsZqs); paramMap.put("login.username", "admin"); paramMap.put("login.password", "ofbiz"); Object[] params = new Object[]{paramMap}; Map result = (Map) client.execute("findAllOrderPlanList", params); System.out.println(result.toString());
得到结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)