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

    得到结果:

  • 相关阅读:
    CentOS安装Nginx Pre-Built
    CMake设置编译参数
    SQLServer脚本编写
    使用QNetworkAccessManager实现Qt的FTP下载服务
    使用CMD命令设置IP
    IIS6(Win2003) 使用.net 4.0 后,默认文档失效解决方案。
    windows7打印时,显示脱机,提示“服务器打印后台处理程序服务没有运行”。
    阻止浏览器自动填表
    Java经典编程题50道之四
    Java经典编程题50道之三
  • 原文地址:https://www.cnblogs.com/BobXie85/p/11346691.html
Copyright © 2011-2022 走看看