这个系列文章将教你如何使用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$ ls tcpmon-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的框架使用方法。当然,还有开发工具的使用。