第四章 理解web service的调用过程(calling process) 

上一章 配置更高效的web service开发环境

本章主要内容: 本章主要讲解了,当你调用一个web service时,其内部到底是如何运作的。

1.不通过client stub调用web service

         假设我们不想通过client stub调用一个web service。我们可以在SimpleService工程中创建一个LowLevelClient.java文件,并把其放入com.ttdev.ss.lowlevel包中:

 

         定义makeRequest()方法:

 

         运行程序文件,正常工作。这个程序使用了被称为AXIOM(Axis2 Object Model)的底层API。通常这样没有使用client stub更容易理解。然而如果需要一些更特殊的自定义操作,必须要通过AXIOM才能实现。

2.再看SOAP消息

         接下来,让我们看看真实的SOAP消息。如何看到实际中的SOAP消息呢?我们要借助于一个名称为“TCP Monitor”的程序。它的工作原理如下图所示。告知客户端把TCP Monitor当作访问目的地(destination).当客户端需要发送一个请求消息时,消息会传递给TCP MonitorTCP Monitor会把接收到的消息打印到控制台上然后把消息转发给真实的访问目的地址(real destinationweb service)。当web service 返回一个响应消息,会把消息先传递给TCP MonitorTCP Monitor响应消息,并把消息转发给客户端。

 

         以上我们说了一通原理,那么如何实际操作呢?去这里下载TCP Monitor的二进制分发版。假设程序包是tcpmon-1.0-bin.zip。解压到c:\tcpmon.在命令行窗口中,进入目录c:\tcpmon\build然后运行文件tcpmon.bat:

 

         这里需要注意的是直接运行文件c:\tcpmon\build\tcpmon.bat程序不会正常工作;必须在当前文件夹C:\tcpmon\build下运行才可以。程序运行后,会出现一个窗口,按照下面的提示进行数据输入:

 

         单击”Add”按钮,将会打开一个新的tab(如下图).这时,TCP Monitor会监听1234端口。选中”XML Format”选项。这种方式会把TCP connection(一个包含了SOAP请求的HTTP请求)的内容以xml格式打印出来。

 

         再客户端,我们需要告知访问endpoint的地址为localhost:1234。比如在类文件LowLevelClient.java:

   

代码
      public class LowLevelClient {

public static void main(String[] args) throws AxisFault {

ServiceClient client 
= new ServiceClient();

Options options 
= new Options();

options.setTo(
new EndpointReference(

http://localhost:1234/axis2/services/SimpleService));

client.setOptions(options);

OMElement request 
= makeRequest();

OMElement response 
= client.sendReceive(request);

System.out.println(response.toString());

}

...

}

 

 

         运行程序在TCP Monitor中你将看到如下消息:

 

         同样的道理,在SimpleClient中可以用指定的endpoint地址覆盖默认的:

 

代码
public class SimpleClient {

public static void main(String[] args) throws RemoteException {

SimpleServiceStub service 
= new SimpleServiceStub(

"http://localhost:1234/axis2/services/SimpleService");

ConcatRequest request 
= new ConcatRequest();

request.setS1(
"abc");

request.setS2(
"123");

ConcatResponse response 
= service.concat(request);

System.out.println(response.getConcatResponse());

      }

}

 

 

本章总结

         如果不通过client stub 访问web service那么就要通过AXIOM接口进行访问。AXIOM是一个底层的接口,因此用起来也不是特别方便,但是它却有很大的灵活性。

         如果你要检测SOAP 消息,可以使用TCP Monitor

作者: 韩连生 发表于 2011-01-26 13:29 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架