zoukankan      html  css  js  c++  java
  • 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());

    得到结果:

  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/BobXie85/p/11346691.html
Copyright © 2011-2022 走看看