使用Axis2的底层API开发Web Service Server端
2011-10-20 13:23
288 查看
1.使用Axis2的底层API开发Web Service Server端
1.1创建一个WebService(取名为MyService)
在MyService中有两个operations,如下所示。
public void ping(OMElement element){}//IN-ONLY模式。仅仅接收OMElement,并对其处理。
public OMElement echo(OMElement element){}//IN_OUT模式。接收OMElemen,并返回OMElement。
1.2如何写Web Service
1)创建实现服务的类。
2)创建services.xml来解析这个Web Service。
3)将其打包成一个*.aar文档(Axis Archive)。
4)部署Web Service。
1.2.1 创建实现服务的类
此类中提供的方法必须与Web Service(在services.xml中声明)中的operations对应。除非你提供了数据绑定,否则所有的方法只能接收一个参数,其类型为OMElement。
双击代码全选
MyService.java
双击代码全选
1.2.2 创建services.xml
Axis2使用services.xml来充当一个Web Servicea的配置文件。每一个使用Axis2部署的Web Service都必须拥有一个services.xml。
双击代码全选
注:The actionMapping is required only if you want to enable WS-Addressing.
可以创建一个services.xml,其中包含一组服务。这样在运行期,你可以在这些服务间共享信息。
双击代码全选
注:name of the service is a compulsory attribute.
1.2.3打包与部署
这里不再详述,参见《基于Tomcat5.0和Axis2开发Web Service应用实例 》。
2.使用Axis2底层APIs实现Web Service客户端
2.1ClientUtil
创建一个客户端通用的SOAP包装Util文件。封装"getEchoOMElement"和"getPingOMElement"分别对应"echo"和"ping"这两个operation。
ClientUtil.java
双击代码全选
2.2Axis2向用户提供了从blocking single channel调用到non-blocking dual channel调用的多种调用Web Service的模式。下面用最简单的blocking调用机制来实现”MyService”中的"echo" operation。
EchoBlockingClient.java
双击代码全选
绿色部分显示了为了调用一个Web Service而需要对operation作的设置。剩下的部分是用来创建OMElement,用来发送和显示相应的OMElement。
结果:
双击代码全选
2.3 PingClient
在”MyService”中,我们有一种IN-ONLY模式的名为"ping"的operation。应用它的客户端代码如下:
PingClient.java
双击代码全选
由于我们在访问一个IN-ONLY模式的operation,所以我们可以直接使用ServiceClient中的"fireAndForget()"方法来调用这个operation。而且那样做的话,不会阻塞发起端,因此,它会立刻将控制权返回给客户端。
2.4 EchoNonBlockingClient
在客户端EchoBlockingClient,一旦调用"serviceClient.sendReceive(payload);",客户端将会被阻塞直到operation完成。这种方式在有很多Web Service需要在一个单一的客户端应用程序中启动时很不可取。一种解决方法是使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API。
EchoNonBlockingClient.java
双击代码全选
用户需要重写"onComplete " 和 "onError "方法。一旦客户端收到Web Service的response,onComplete方法将会被调用,这样将中止阻塞状态。
2.5EchoNonBlockingDualClient
当调用的Web Service需要很长一段时间来完成时,这种由Non-Blocking API提供的解决方式将有一定的局限性。这种局限性是由使用单一的传输连接来调用Web Service并接收response造成的。换句话说,客户端提供一种没有阻塞的调用机制,但request和response的传输使用单一的传输(双工方式)连接(如HTTP)。长时间运行的Web Service调用或Web Service调用使用单工传输方式(如SMTP)不能简单地利用一个没有阻塞的调用。
一种尝试地解决方法是request和response各自使用单独的传输连接(单工或双工均可)。这种方式产生的问题是如何解决相关性(关联request和response)。WS-Addressing提供了一种很好的解决方法,在头中使用<wsa:MessageID> 和 <wsa:RelatesTo> 标签。Axis2对这种基于关联机制的寻址方式提供了支持。
用户可以选择Blocking 或Non-Blocking APIs的Web Service,并使用两个传输连接。通过使用一个布尔标记,同一个API可以调用多个在两个传输连接上的Web Services(IN-OUT operations)。下例使用Non-Blocking API 以及两个传输连接来实现上文中提到的"echo" operation。
EchoNonBlockingDualClient.java
双击代码全选
注解①
RE: [Axis2] 0.95 WS-Addressing web SERVICE-SIDE: module not found
I now have managed to get EchoNonBlockingDualClient working. I still can't get the original code to work, where ever I put addressing-0.95.mar, but the ConfigurationContext works.
The code I ended up with was:
双击代码全选
with no need, obviously, for the .engageModule method.
I did discover though that the directory which the ConfigurationContext points to has to have two directories within it: "conf", which must contain the axis.xml configuration file, and the "modules" directory which contains addressing-0.95.mar.
在方法"options.setUseSeparateListener(...)"中的布尔标记通知通知Axis2引擎使用两个不同的传输连接来分别处理request和response。Finally中的 "serviceClient.finalizeInvoke()"方法通知Axis2引擎停用客户端的用于接收response的listener。
在我们运行客户端的例程之前,我们还有一件事情要做。如前面提到的,Axis2使用基于地址的关联机制,因此我们必须在服务器端和客户端“搭建”寻址模块。
结果:
双击代码全选
2.6 实现服务器端的寻址
根据Axis2的结构,寻址模块在"pre-dispatch"阶段已经给出它的句柄。因此,所谓的“搭建”仅仅是在”axis2.xml”(注意不是services.xml)增加一个模块的引用。现在将下面这行字加入到axis2.xml,该文件在"/webapps/axis2/WEB-INF/conf"目录下。
<module ref="addressing"/>
注: 一旦你改变了axis2.xml,你必须重启这个servlet容器,改变才能生效。
2.7 实现客户端的寻址
有两种方式。
一种方法是在%Axis2_HOME%axis2-std-1.0-binmodules目录下得到addressing-<version>.mar。并且在你的classpath中对其可见。(此种方法目前,我还没有调试成功,具体见注解①。下面的第二种方法可用)
另一种方法是创建一个ConfigurationContext,指定一个repository位置。Axis2支持repository的方式来保存服务和模块。
你可以使用二进制distribution作为repository,只要它含有一个Axis2 repository认可的repository结构(其中应包含services和modules目录)。ConfigurationContext 中含有Axis2体系的运行时的上下文信息。
如果你解压一个标准的二进制distribution到目录(譬如)$user_home/axis2/dist, 那么在 sender = new ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):
new ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):
双击代码全选
这样可以在客户端和服务器端都实现寻址。
2.8 EchoBlockingDualClient
这又是一个两路的传输的request/response客户端,但这次,我们使用一个Blocking API。实现机制和EchoNonBlockingDualClient差不多,唯一的不同是,这里不需要使用一个callback对象来处理response。
EchoBlockingDualClient.java
双击代码全选
结果:
双击代码全选
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/25592
1.1创建一个WebService(取名为MyService)
在MyService中有两个operations,如下所示。
public void ping(OMElement element){}//IN-ONLY模式。仅仅接收OMElement,并对其处理。
public OMElement echo(OMElement element){}//IN_OUT模式。接收OMElemen,并返回OMElement。
1.2如何写Web Service
1)创建实现服务的类。
2)创建services.xml来解析这个Web Service。
3)将其打包成一个*.aar文档(Axis Archive)。
4)部署Web Service。
1.2.1 创建实现服务的类
此类中提供的方法必须与Web Service(在services.xml中声明)中的operations对应。除非你提供了数据绑定,否则所有的方法只能接收一个参数,其类型为OMElement。
Axis2使用services.xml来充当一个Web Servicea的配置文件。每一个使用Axis2部署的Web Service都必须拥有一个services.xml。
可以创建一个services.xml,其中包含一组服务。这样在运行期,你可以在这些服务间共享信息。
1.2.3打包与部署
这里不再详述,参见《基于Tomcat5.0和Axis2开发Web Service应用实例 》。
2.使用Axis2底层APIs实现Web Service客户端
2.1ClientUtil
创建一个客户端通用的SOAP包装Util文件。封装"getEchoOMElement"和"getPingOMElement"分别对应"echo"和"ping"这两个operation。
ClientUtil.java
EchoBlockingClient.java
结果:
在”MyService”中,我们有一种IN-ONLY模式的名为"ping"的operation。应用它的客户端代码如下:
PingClient.java
2.4 EchoNonBlockingClient
在客户端EchoBlockingClient,一旦调用"serviceClient.sendReceive(payload);",客户端将会被阻塞直到operation完成。这种方式在有很多Web Service需要在一个单一的客户端应用程序中启动时很不可取。一种解决方法是使用Non-Blocking API来调用这些Web Services。Axis2提供给用户一种基于回叫机制的non-blocking API。
EchoNonBlockingClient.java
2.5EchoNonBlockingDualClient
当调用的Web Service需要很长一段时间来完成时,这种由Non-Blocking API提供的解决方式将有一定的局限性。这种局限性是由使用单一的传输连接来调用Web Service并接收response造成的。换句话说,客户端提供一种没有阻塞的调用机制,但request和response的传输使用单一的传输(双工方式)连接(如HTTP)。长时间运行的Web Service调用或Web Service调用使用单工传输方式(如SMTP)不能简单地利用一个没有阻塞的调用。
一种尝试地解决方法是request和response各自使用单独的传输连接(单工或双工均可)。这种方式产生的问题是如何解决相关性(关联request和response)。WS-Addressing提供了一种很好的解决方法,在头中使用<wsa:MessageID> 和 <wsa:RelatesTo> 标签。Axis2对这种基于关联机制的寻址方式提供了支持。
用户可以选择Blocking 或Non-Blocking APIs的Web Service,并使用两个传输连接。通过使用一个布尔标记,同一个API可以调用多个在两个传输连接上的Web Services(IN-OUT operations)。下例使用Non-Blocking API 以及两个传输连接来实现上文中提到的"echo" operation。
EchoNonBlockingDualClient.java
RE: [Axis2] 0.95 WS-Addressing web SERVICE-SIDE: module not found
I now have managed to get EchoNonBlockingDualClient working. I still can't get the original code to work, where ever I put addressing-0.95.mar, but the ConfigurationContext works.
The code I ended up with was:
I did discover though that the directory which the ConfigurationContext points to has to have two directories within it: "conf", which must contain the axis.xml configuration file, and the "modules" directory which contains addressing-0.95.mar.
在方法"options.setUseSeparateListener(...)"中的布尔标记通知通知Axis2引擎使用两个不同的传输连接来分别处理request和response。Finally中的 "serviceClient.finalizeInvoke()"方法通知Axis2引擎停用客户端的用于接收response的listener。
在我们运行客户端的例程之前,我们还有一件事情要做。如前面提到的,Axis2使用基于地址的关联机制,因此我们必须在服务器端和客户端“搭建”寻址模块。
结果:
根据Axis2的结构,寻址模块在"pre-dispatch"阶段已经给出它的句柄。因此,所谓的“搭建”仅仅是在”axis2.xml”(注意不是services.xml)增加一个模块的引用。现在将下面这行字加入到axis2.xml,该文件在"/webapps/axis2/WEB-INF/conf"目录下。
<module ref="addressing"/>
注: 一旦你改变了axis2.xml,你必须重启这个servlet容器,改变才能生效。
2.7 实现客户端的寻址
有两种方式。
一种方法是在%Axis2_HOME%axis2-std-1.0-binmodules目录下得到addressing-<version>.mar。并且在你的classpath中对其可见。(此种方法目前,我还没有调试成功,具体见注解①。下面的第二种方法可用)
另一种方法是创建一个ConfigurationContext,指定一个repository位置。Axis2支持repository的方式来保存服务和模块。
你可以使用二进制distribution作为repository,只要它含有一个Axis2 repository认可的repository结构(其中应包含services和modules目录)。ConfigurationContext 中含有Axis2体系的运行时的上下文信息。
如果你解压一个标准的二进制distribution到目录(譬如)$user_home/axis2/dist, 那么在 sender = new ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):
new ServiceClient();之前加入(具体见EchoNonBlockingDualClient.java):
2.8 EchoBlockingDualClient
这又是一个两路的传输的request/response客户端,但这次,我们使用一个Blocking API。实现机制和EchoNonBlockingDualClient差不多,唯一的不同是,这里不需要使用一个callback对象来处理response。
EchoBlockingDualClient.java
相关文章推荐
- 使用Axis2的底层API开发Web Service
- 使用Axis2的底层API开发Web Service
- 使用Axis2的底层API开发Web Service
- 使用Axis2的底层API开发Web Service
- 使用Axis2的底层API开发Web Service
- 使用 Axis2主要API开发WebService客户端
- 淘宝API开发系列---淘宝API的测试及使用
- c#使用API进行模拟鼠标点击 底层操作同样简单
- 使用domapi做ajax开发
- 【iOS开发】如何使用中国气象局API开发天气APP
- android开发教程之获取使用当前api的应用程序名称
- ArcGIS API for Windows Phone开发实例(4):点击查看超市信息 --- 关于使用InforWindow
- 为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API
- 浅谈使用 PHP 进行手机 APP 开发(API 接口开发)
- 使用Google Map Api在Android平台上开发地图应用4
- 通过 Axis2 开发 Web 服务,第 1 部分: 通过 Axis2 运行时部署和使用简单 Web 服务
- 使用Axis2开发Web服务 --- 客户端调用
- WEB开发中,使用JSON-RPC好,还是RESTful API好?
- 使用高德JS-API进行基于LBS的开发-地图初始化&地图控件
- 一款基于网易云音乐 UI,使用 Gank.Io 及豆瓣 api 开发的符合 Google Material Design 的 Android 开源项目.