当前位置:文档之家› Webservice接口开发

Webservice接口开发

Webservice接口开发Author:Geloin目录1 准备工作 (1)2 服务器端 (1)2.1 主程序 (1)2.2 services.xml (2)2.3 传值方式 (3)2.4 打包 (4)2.5 发布 (6)3 客户端 (8)3.1 导入包 (8)3.2 示例代码 (8)3.3 代码解析 (10)3.3.1 设定服务器地址 (10)3.3.2 设定action (10)3.3.3 设定要调用的方法名 (11)3.3.4 设定客户端控件 (11)3.3.5 设定命名空间 (11)3.3.6 设定需要传送的值 (11)3.3.7 设定返回数据类型 (11)3.3.8 获取返回结果 (12)1准备工作至/axis2/下载axis2的bin及war包,分别解压之,在环境变量中添加AXIS2_HOM,将axis2.war放置到tomcat/webapps目录下,启动tomcat,用浏览器打开http://localhost:8080/axis2,如下图所示:2服务器端2.1主程序服务器端可以是任何一个程序,例如下面的例子:public class Test {// 此程序返回一个字符串public String test1(String arg) {return arg + “测试”;}// 此程序返回一个一维数组public String[] test2(String arg) {String[] result = new String[]{arg};return result;}// 当返回值为多维数组时,将之转化为一维数组返回public String[] test3(String arg) {String[] result = new String[]{“测试,” + arg};return result;}// 当返回值为其它类型,例如自定义类型、Map、List等时,将其序列化(冷冻或腌成咸菜)后返回public byte[] test4(String arg) {Map<Object, Object> map = new HashMap<Object, Object>();map.put(“测试”, arg);java.io.ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(map);return baos.toByteArray();}}2.2s ervices.xml需要在根目录下建立META-INF文件夹,文件夹下放置MANIFEST.MF和services.xml文件,最好自己写好MANIFEST.MF文件,不然导出的时候可能会出错。

services.xml文件的内容如下:<?xml version="1.0" encoding="UTF-8"?><serviceGroup><service name="testService"><!—服务名,在客户端调用时需要用到--> <!—你所写的服务器端程序,包括包名--><parameter name="ServiceClass">test.Test</parameter><!—方法名--><operation name="test1"><!—传值方式--><messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation><operation name="test2"><messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation><operation name="test3"><messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation><operation name="test4"><messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></operation></service></serviceGroup>2.3传值方式上文中提及到传值方式,即:<messageReceiverclass="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />片段,在AXIS2中有两种传值方式,分别为:org.apache.axis2.rpc.receivers.RPCMessageReceiver:即需要客户端传参数过来,又返回值。

org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver:需要客户端传参数过来,但不返回值。

2.4打包在Eclipse下右键点击项目名,Export..,JAR file,在JAR File Specification进行如下勾选:注意,文件名的后缀为aar,Next后进行如下勾选:Next后进行如下勾选:注意,请写好MANIFEST.MF文件,如下所示:Manifest-Version: 1.0Class-Path: lib/mysql-connector-java-5.1.12-bin.jar2.5发布用浏览器打开http://localhost:8080/axis2,如下图所示:点击Administration,登录,用户名为admin,密码为axis2,如下图所示:点击upload Service,如下图所示:按照提示上传aar文件即可,其中,aar文件是2.4中打包时得到的文件。

3客户端3.1导入包需要使用的包如下图所示:3.2示例代码import的包如下图所示:代码如下图所示:// 服务器地址String serviceAddress = "http://localhost:8888/axis2/services/testService";// 服务器对应的action,如果不知道的话随便写,系统运行时会提示你的String action = "";// 方法名String methodName = "test1";// 客户端控件RPCServiceClient serviceClient = new RPCServiceClient();Options options = serviceClient.getOptions();EndpointReference targetEPR = new EndpointReference(serviceAddress); options.setTo(targetEPR);// 命名空间QName qName = new QName(action, methodName);// 需要传递给服务器的值Object[] values = new Object[]{license};// 返回值的类型,基本类型为Class<?>[] returnType = new Class[]{String.class};// 返回结果Object[] result = serviceClient.invokeBlocking(qName, values, returnType);return result[0].toString();3.3代码解析3.3.1设定服务器地址首先,你需要设定webservice服务器的地址,即:String serviceAddress = "http://localhost:8888/axis2/services/testService";登际http://localhost:8080/axis2,点击Services,如下图所示:如上图所示,会列出所有webservice服务的地址及能够使用的方法。

3.3.2设定action如以下代码所示:String action = "";action的值可以随便写,如有错误,程序在执行过程中会给予提示。

3.3.3设定要调用的方法名如以下代码所示:String methodName = "test1";这里指的是要调用服务器上的哪个方法。

3.3.4设定客户端控件如以下代码所示:RPCServiceClient serviceClient = new RPCServiceClient();Options options = serviceClient.getOptions();EndpointReference targetEPR = new EndpointReference(serviceAddress);options.setTo(targetEPR);这一部分为公用代码,直接拷贝即可。

3.3.5设定命名空间如以下代码所示:QName qName = new QName(action, methodName);这一部分为公用代码,直接拷贝即可。

3.3.6设定需要传送的值如以下代码所示:Object[] values = new Object[]{license};这里设定的是要传递给服务器的参数。

3.3.7设定返回数据类型如以下代码所示:Class<?>[] returnType = new Class[]{String.class};这里设定的是服务器返回给客户端的值的类型,分为以下几种:(1)简单类型的参数,如String、int、long、double等待,使用以下代码:Class<?>[] returnType = new Class[]{String.class };Class<?>[] returnType = new Class[]{Integer.class };Class<?>[] returnType = new Class[]{Long.class};(2)一维数组和二维数组,使用以下代码:Class<?>[] returnType = new Class[]{String[].class};(3)复杂数据类型,即通过序列化的数据类型,使用以下代码:Class<?>[] returnType = new Class[]{byte[].class};3.3.8获取返回结果如以下代码所示:Object[] result = serviceClient.invokeBlocking(qName, values, returnType);return result[0].toString();获取服务器返回的结果,有以下几种情况:(1)简单数据类型,使用以下代码:Object[] result = serviceClient.invokeBlocking(qName, values, returnType);String result = "";if (null != obj && obj.length > 0) {result = obj[0].toString();} else {result = null;}(2)一维数组,使用以下代码:Object[] obj = serviceClient.invokeBlocking(opQName, values, returnType);String[] result = null;if (null != obj && obj.length > 0) {result = (String[]) obj[0];} else {result = null;}(3)多维数组,使用以下代码:Object[] obj = serviceClient.invokeBlocking(qName, values, returnType); String[] result = null;if (null != obj && obj.length > 0) {result = (String[]) obj[0];// 分解多维数组for (String s : result) {String[] array = s.split(",");for (String ss : array) {System.out.print("<" + ss + "> ");}System.out.println();}} else {result = null;}(4)复杂对象,传递序列化后的值,需要解冻(回鲜):Object[] obj = serviceClient.invokeBlocking(qName, values, returnType); Map<Object, Object> result = null;if (null != obj && obj.length > 0) {byte[] buffer = (byte[]) obj[0];ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(buffer));result = (Map<Object, Object>) ois.readObject();} else {result = null;}。

相关主题