首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

手把手教你玩转WebService(1)

2012-06-29 
手把手教你玩转WebService(一)这个系列文章将教你如何使用Apache CXF开发基于SOAP协议的WebService,并将用

手把手教你玩转WebService(一)
这个系列文章将教你如何使用Apache CXF开发基于SOAP协议的WebService,并将用到多好玩的开发工具。

本文为开篇,我决定先通过一个Demo,向你展示一个WebService的实例。请确保你的机器上安装了这些工具:

* git
* java
* ant
* eclipse for javaee
* tcpmon

以下是我的工作环境:

git

git将用于从github上面签出demo项目。下面是我的环境:



java

我的java环境如下:



ant

ant是java的编译工具,网址位于:

http://ant.apache.org/




请确保你的机器上安装了它。我的ant版本如下:



eclipse



eclipse是java开发的IDE工具,它有多种发行版本,我在这个系列文章里面要用到Eclipse IDE for Java EE发行版本中的WebService开发功能,所以必须安装这个版本:

http://www.eclipse.org/downloads/moreinfo/jee.php


tcpmon

tcpmon是一个小巧的协议调试工具,它的下载地址位于:

http://ws.apache.org/commons/tcpmon/download.cgi


是一个很小的压缩包,解开后,可以看到里面有一个build目录,这里面有我们要用到的工具:

tcpmon-1.0-bin/build$ lstcpmon-1.0.jar tcpmon.bat     tcpmon.sh


确保可以运行起来:



准备工作完成后,从github.com上迁出这个项目:

https://github.com/liweinan/try-cxf-soap


使用下面的命令:

git clone git://github.com/liweinan/try-cxf-soap.git


这个项目自带了全部所需jar,所以下载时间比较长,需要耐心等待。下载完成后,进入项目目录,输入下述命令:

ant server


启动WebService的服务端:



此时我们绑定了一个sayHello的WebService服务,这个服务非常简单:用户请求一个字串,服务端返回 "Hello" + 请求字串。假设用户请求为"world",则服务端返回:"Hello, world"。

因此,这个demo里面包含了一个客户端,用来调用服务端的sayHello服务,并显示服务端的返回:



从上图可以看到,用下面这行命令来调用客户端:

ant client


最后,我们保持服务端不关闭,此时用Firefox可以查看WebService接口的wsdl描述信息,在Firefox中访问:

http://127.0.0.1:8080/ws/sayHello?wsdl


可以看到wsdl描述信息:



Demo看完以后,我们将这项目导入至eclipse。打开eclipse,选择:

File -> New -> Project...


此时新建工程窗口打开,输入ant:



可以看到"Java Project from Existing Ant Buildfile",选它。此时eclipse让你选择待导入的build.xml文件,选择我们这个try-cxf-soap项目目录中的build.xml:



点击Open,这个时候项目将被导入至eclipse:



注意到项目里面有一个hello.wsdl文件,如果你装的eclipse版本为for java ee,此时应该可以双击这个hello.wsdl,进入wsdl文件编辑界面:



我们在后续的文章中将使用这个工具开发WebService。

最后,让我们来使用tcpmon这个工具来查看一下客户端与服务端通讯时的SOAP协议包。

启动tcpmon,点击Admin Tab,然后将Listen Port设为1234,Target Port设为8080:



点击Add后,多出来一个1234端口的侦听页面:



接下来,我们要在demo项目的源代码中加些东西。在eclipse中,找到:

HelloService_HelloServiceSOAP_Client.java


这个类:



将main方法的代码改为:

public static void main(String args[]) throws java.lang.Exception {HelloService_Service ss = new HelloService_Service((new File(args[0])).toURI().toURL(), SERVICE_NAME);HelloService port = ss.getHelloServiceSOAP();BindingProvider bp = (BindingProvider) port;Map<String, Object> context = bp.getRequestContext();context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:1234/ws/sayHello");{System.out.println("Invoking sayHello...");net.bluedash.ws.HelloRequest _sayHello_request = new HelloRequest();_sayHello_request.setWho("world");java.lang.String _sayHello__return = port.sayHello(_sayHello_request);System.out.println("sayHello.result=" + _sayHello__return);}System.exit(0);}


等于添加了这样几行:

BindingProvider bp = (BindingProvider) port;Map<String, Object> context = bp.getRequestContext();context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:1234/ws/sayHello");


实际上就是增加了tcpmon中对侦听端口的绑定。此时在命令行中,在项目根目录下重新启动服务端并执行客户端:

ant client


客户端请求完成后,此时查看tcpmon:



可以看到客户端请求与服务端的返回的数据包都被截获了。但是里面的信息格式有点乱,不易阅读,此时我们勾选左下角的“XML Format":



然后点击Resend:



可以看到数据变得容易阅读了,客户端的请求为:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>   <ns2:helloRequest xmlns:ns2="http://bluedash.net/ws">      <who>world</who>   </ns2:helloRequest></soap:Body></soap:Envelope>


服务端的返回为:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body>   <ns2:helloResponse xmlns:ns2="http://bluedash.net/ws">Hello, world</ns2:helloResponse></soap:Body></soap:Envelope>


小结

本文带你过了一遍这个系列文章要用到的Demo,带你使用了一系列在开发过程中需要用到的工具。在后续的文章中,我将带你深入代码细节,理解SOAP协议的基本概念及Apache CXF的框架使用方法。当然,还有开发工具的使用。

热点排行