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());

得到结果:

原文地址:https://www.cnblogs.com/BobXie85/p/11346691.html