使用AXIS2 创建WS客户端的四种方法
上一篇 / 下一篇 2009-06-01 14:00:54 / 个人分类:Web Service
本文翻译自http://ws.apache.org/axis2/1_4_1/quickstartguide.html部分章节
本章基于StockQuoteService类通过四种方法创建客户端,1、基于AXIOM 的客户端2、用Axis2 Databinding Framework(ADB)3、使用XMLBeans 4、使用JiBX
1、 为创建一个使用AXIOM,执行以下步骤:
同样的,复制以下目录文档以便于文档的完整性
- quickstartaxiom
- README.txt
- build.xml
- resources
- META-INF
- services.xml
- StockQuoteService.wsdl
- src
- samples
- quickstart
- service
- axiom
- StockQuoteService.java
- clients
- AXIOMClient.java
以上引用的AXIOMClient.java类如下所定义
package samples.quickstart.clients;
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.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
public class AXIOMClient {
private static EndpointReference targetEPR =
new EndpointReference("http://localhost:8080/axis2/services/StockQuoteService");
public static OMElement getPricePayload(String symbol) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace mNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
OMElement method = fac.createOMElement("getPrice", omNs);
OMElement value = fac.createOMElement("symbol", omNs);
value.addChild(fac.createOMText(value, symbol));
method.addChild(value);
return method;
}
public static OMElement updatePayload(String symbol, double price) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace mNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
OMElement method = fac.createOMElement("update", omNs);
OMElement value1 = fac.createOMElement("symbol", omNs);
value1.addChild(fac.createOMText(value1, symbol));
method.addChild(value1);
OMElement value2 = fac.createOMElement("price", omNs);
value2.addChild(fac.createOMText(value2,
Double.toString(price)));
method.addChild(value2);
return method;
}
public static void main(String[] args) {
try {
OMElement getPricePayload = getPricePayload("WSO");
OMElement updatePayload = updatePayload("WSO", 123.42);
Options ptions = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP);
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
sender.fireAndForget(updatePayload);
System.err.println("price updated");
OMElement result = sender.sendReceive(getPricePayload);
String response = result.getFirstElement().getText();
System.err.println("Current price of WSO: " + response);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Axis2使用AXIOM或者AXIs对象模型,一个类DOM(Document Object Model文本对象模型)结构的机遇StAX API( Streaming API for XML),这里为服务中的update和getPrice方法建立载荷,载荷的创建类似为AXIOM服务的创建getPriceResponse载荷,然后建立Options类,创建一个ServiceClient类用来和服务通信。首先调用update方法,它是一个fireAndForget方法并且不返回任何数据,最后,可以调用getPrice方法,取回服务的当前价格并显示出来
现在可以构建并运行AXIOM客户端,通过在Axis2_HOME/samples/quickstartaxiom目录中输入ant run.client
应该能够得到如下输出:
done
Current price of WSO:123.42
2、 使用ADB创建客户端
为了使用ADB创建一个客户端,执行以下步骤:
在目录Axis2_HOME/samples/quickstartadb下输入以下命令以创建databings客户端
%AXIS2_HOME%\bin\WSDL2Java -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d adb -s -o build\client
另外在目录Axis2_HOME/samples/quickstartadb下输入ant generate.client
接下来看下quickstartadb/src/samples/quickstart/clients/ADBClient.java文件的编码如下:
package samples.quickstart.clients;
import samples.quickstart.service.adb.StockQuoteServiceStub;
public class ADBClient{
public static void main(java.lang.String args[]){
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService");
getPrice(stub);
update(stub);
getPrice(stub);
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
/* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
StockQuoteServiceStub.Update req = new StockQuoteServiceStub.Update();
req.setSymbol ("ABC");
req.setPrice (42.35);
stub.update(req);
System.err.println("price updated");
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
/* two way call/receive */
public static void getPrice(StockQuoteServiceStub stub){
try{
StockQuoteServiceStub.GetPrice req = new StockQuoteServiceStub.GetPrice();
req.setSymbol("ABC");
StockQuoteServiceStub.GetPriceResponse res =
stub.getPrice(req);
System.err.println(res.get_return());
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
}
这个类使用创建的ADB产生了一个class stub,然后它通过web service调用getPrice和update,getPrice方法新建了GetPrice载荷并将symbol设置为ABC,然后它发送请求并显示当前的就爱个。Update方法新建了一个Update载荷,将symbol设置为ABC价格设为42.35
现在编译并运行客户端:
在Axis2_HOME/samples/quickstartadb目录下输入ant run.client
将得到如下输出:
42
Price updated
42.35
3、 使用XMLBeans创建一个客户端
使用XML Beans数据绑定方法创建客户端,需要执行以下步骤:
通过在xmlbeansClient目录下输入以下命令来创建databings
%AXIS2_HOME%\bin\WSDL2Java -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d xmlbeans -s -o build\client
另外,在目录Axis2_HOME/samples/quickstartxmlbeans下输入ant generate.client
注意这创建了一个client stub并没有服务器端代码
文件quickstartxmlbeans/src/samples/quickstart/clients/XMLBEANSClient.java代码如下定义:
Code Listing 11: The XMLBEANSClient class
package samples.quickstart.clients;
import samples.quickstart.service.xmlbeans.StockQuoteServiceStub;
import samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;
import samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.UpdateDocument;
public class XMLBEANSClient{
public static void main(java.lang.String args[]){
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService");
getPrice(stub);
update(stub);
getPrice(stub);
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
/* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
UpdateDocument reqDoc = UpdateDocument.Factory.newInstance();
UpdateDocument.Update req = reqDoc.addNewUpdate();
req.setSymbol ("BCD");
req.setPrice (42.32);
stub.update(reqDoc);
System.err.println("price updated");
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
/* two way call/receive */
public static void getPrice(StockQuoteServiceStub stub){
try{
GetPriceDocument reqDoc = GetPriceDocument.Factory.newInstance();
GetPriceDocument.GetPrice req = reqDoc.addNewGetPrice();
req.setSymbol("BCD");
GetPriceResponseDocument res =
stub.getPrice(reqDoc);
System.err.println(res.getGetPriceResponse().getReturn());
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
}
4、 使用JiBX创建客户端
为了使用JiBX创建一个客户端,需要执行以下步骤
在Axis2_HOME/samples/quickstartjibx目录下,在控制台输入以下命令创建一个客户端stub
%AXIS2_HOME%\bin\wsdl2java -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d jibx -s -uw -o build\client
TAG: