OFBIZ webservice簡介

鄭再鵬發表於2015-10-01

OFBIZ webservice簡介

 

Opentaps(OFBiz 9.04之後)中webservice用的是AXIS2,最開始自己在網上搜了好多資料,自己拿回來測試,發現都不對。後自己再找了下AXIS的資料說,那種報錯很有可能是由於兩個版本不對引起的,所以就決定看看OFBiz裡面用的是哪個版本,當時我徹底無語了,裡面兩個版本的包竟然都有,真不知道是什麼意思。但是我認為應該是AXIS2,OFBiz這麼與時俱進的東西,應該不太可能用06年就不更新的架包。

廢話少說,直接說開發步驟吧:

一:在專案中引入AXIS2,由於AXIS2的依賴包好幾個,客戶端應該不需要那麼多,但是以防萬一,我們把AXIS2下面lib目錄的所有jar包一併加入到開發工程的classpath下。

 

 

 

二:開發webservice必須知道wsdl才能比較好的。首先我們在OFBiz中開啟一個service,讓它能被髮不成webservice。這個非常簡單,在OFBiz中你只要在service定義的xml中,把要釋出的service新增一個屬性export=”true”,重啟服務就能看到。下面以一個例項來說明:

<!--[if !supportLists]-->① <!--[endif]-->:我們找到application/order/servicedef/services.xml檔案,開啟找到最後一個service,這裡有個自帶的SOAP測試服務,我們新增一個service,export="true"加上去,最後變成:

 

方法java程式碼為:

 

<!--[if !supportLists]-->② <!--[endif]-->:現在只是釋出了,但是我們必須要知道怎樣請求才能得到這個服務,ofbiz提供了一個event來處理它,就是<handler name="soap" type="request" class="org.ofbiz.webapp.event.SOAPEventHandler"/>,要使用它,你必須把這個定義在你的controller.xml檔案中,當然,如果你已經引入了<include location="component://common/webcommon/WEB-INF/common-controller.xml"/>,那麼就不需要了,這個裡面已經定義好了。直接使用就行了。

 

<!--[if !supportLists]-->③ <!--[endif]-->重啟服務,在瀏覽器中輸入

http://localhost:8080/ordermgr/control/SOAPServices/testSoap?wsdl,如果你看到了你剛才釋出的服務,說明已經成功。如下圖:

 

三:客戶端編寫。

客戶端程式碼編寫最主要是要知道服務端想要的是什麼東西,首先我們的服務類的定義我們可以看到是需要一個輸入輸出,一個輸入,三個輸出的,也就是兩個進,兩個出。在wsdl中我們可以看到

 

 

說明我們需要傳入的是一個map-Map形式的Model,並且salt和userid是必須的。由於我們沒有設定驗證資訊,所以login.username和login.password是可以不需要的。直接上程式碼比較好一些。

在測試的時候我僅僅弄了一個很簡單的例子,由於axiom比較複雜,還要詳細研究下。類說明:ClientGenricValue,封裝的是要傳入資料的型別,鍵key和值。ClientUtil

package com.wx;

 

public class ClientGenericValue {

 

private String type;

private String key;

private String value;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type;

}

public String getKey() {

return key;

}

public void setKey(String key) {

this.key = key;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

 

 

}

 

 

package com.wx;

 

import java.util.List;

 

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.AxisFault;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

 

public class ClientUtil {

 

private static OMFactory factory = OMAbstractFactory.getOMFactory();

private String endPoint;

private List<ClientGenericValue> valueList;

private String om;

private String serviceName;

 

public ClientUtil(String endPoint, String serviceName , String om,

List<ClientGenericValue> valueList) {

this.endPoint = endPoint;

this.serviceName = serviceName;

this.om = om;

this.valueList = valueList;

}

 

 

 

public ServiceClient createClient() throws AxisFault {

ServiceClient client = new ServiceClient();

Options options = new Options();

 

EndpointReference targetERP = new EndpointReference(endPoint); //定義目的EndpointReference,就是服務地址

options.setTo(targetERP);

options.setTimeOutInMilliSeconds(400000); //定義超時,這裡可以不定義

 

client.setOptions(options);

return client;

}

 

public OMElement send() throws AxisFault{

OMNamespace ns = factory.createOMNamespace("http://ofbiz.apache.org/service/", serviceName);

OMElement root = factory.createOMElement(serviceName, ns);

 

OMElement data = factory.createOMElement("map-HashMap", null);

root.addChild(data);

for(ClientGenericValue value : valueList){

OMElement mapKey = factory.createOMElement("map-Entry", null);

 

OMElement keyElement = factory.createOMElement("map-Key", null);

OMElement keyValue = factory.createOMElement("std-String", null);

keyValue.addAttribute(factory.createOMAttribute("value", null, value.getKey()));

keyElement.addChild(keyValue);

 

 

OMElement valueElement = factory.createOMElement("map-Value", null);

OMElement valueValue = factory.createOMElement(value.getType(), null);

valueValue.addAttribute(factory.createOMAttribute("value", null, value.getValue()));

valueElement.addChild(valueValue);

 

mapKey.addChild(keyElement);

mapKey.addChild(valueElement);

 

data.addChild(mapKey);

}

System.out.println(root);

OMElement result = createClient().sendReceive(root);

return result;

}

 

 

 

public String getEndPoint() {

return endPoint;

}

 

public void setEndPoint(String endPoint) {

this.endPoint = endPoint;

}

 

}

 

package com.wx;

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.axiom.om.OMElement;

import org.apache.axis2.AxisFault;

 

public class ClientTest {

 

/**

* @param args

* @throws AxisFault

*/

public static void main(String[] args) {

String endPoint = "http://localhost:8080/ordermgr/control/SOAPServices/testSoap";

String serviceName = "testSoap";

String om = "http://ofbiz.apache.org/service/";

List<ClientGenericValue> valueList = getTestData();

 

 

ClientUtil cu = new ClientUtil(endPoint, serviceName, om, valueList);

 

try {

OMElement result = cu.send();

System.out.println("Sent Hello, got : " + result.toString());

} catch (AxisFault e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

public static List<ClientGenericValue> getTestData(){

List<ClientGenericValue> valueList = new ArrayList<ClientGenericValue>();

ClientGenericValue value1 = new ClientGenericValue();

value1.setType("std-String");

value1.setKey("userid");

value1.setValue("11111");

 

ClientGenericValue value2 = new ClientGenericValue();

value2.setType("std-String");

value2.setKey("salt");

value2.setValue("The power of OFBiz");

 

// ClientGenericValue value3 = new ClientGenericValue();

// value3.setType("eeval-OrderItemTypeAttr");

// value3.setKey("testing");

// value3.setValue("org.ofbiz.entity.GenericValue"); //這個可以不用填寫的

 

valueList.add(value1);

valueList.add(value2);

// valueList.add(value3);

return valueList;

}

}

相關文章