07年底的时候就开始学习web service,那时候学习Axis1.4并用于项目。这次公司又使用Axis,因为是遗留系统,本来使用的就是Axis。于是对Web Service和Axis1.4进行了一个学习总结。

1、WebService的概念
Web Service是一个比较新的分布式服务组件,本质上就是以标准化的方式实现企业内部各个不同服务系统之间的互调或者集成。实现以上目的需要三个元素:
1、服务B以一种标准化的语言告诉服务A它能提供什么服务,以及如何调用它,它的服务在哪里,这就是Web Service的服务描述,是what,how和where部分;
2、服务A要以一种标注化的通信消息格式告诉服务B,它想调用什么服务,以及相应的输入参数。当服务完成后,B会以同样标注化的方式返回相应的服务结果,这就是Web Service的服务消息的request和response部分;
3、服务B注册到相应的地址,以便外部找到,是URL部分。

上面三个元素实际上对应于Web Services的三个组成部分,WSDLSOAP和UDDI。

WSDL1.1和2.0,其中1.1应用最为广泛,支持最多,Axis2.0支持WSDL2.0。

<?xml version="1.0"?>
<definitions name="StockQuote"

targetNamespace
="http://example.com/stockquote.wsdl"
          xmlns:tns
="http://example.com/stockquote.wsdl"
          xmlns:xsd1
="http://example.com/stockquote.xsd"
          xmlns:soap
="http://schemas.xmlsoap.org/wsdl/soap/"
          xmlns
="http://schemas.xmlsoap.org/wsdl/">

    
<types>
       
<schema targetNamespace="http://example.com/stockquote.xsd"
              xmlns
="http://www.w3.org/2000/10/XMLSchema">
           
<element name="TradePriceRequest">
              
<complexType>
                  
<all>
                      
<element name="tickerSymbol" type="string"/>
                  
</all>
              
</complexType>
           
</element>
           
<element name="TradePrice">
              
<complexType>
                  
<all>
                      
<element name="price" type="float"/>
                  
</all>
              
</complexType>
           
</element>
       
</schema>
    
</types>

    
<message name="GetLastTradePriceInput">
        
<part name="body" element="xsd1:TradePriceRequest"/>
    
</message>

    
<message name="GetLastTradePriceOutput">
        
<part name="body" element="xsd1:TradePrice"/>
    
</message>

    
<portType name="StockQuotePortType">
        
<operation name="GetLastTradePrice">
           
<input message="tns:GetLastTradePriceInput"/>
           
<output message="tns:GetLastTradePriceOutput"/>
        
</operation>
    
</portType>

    
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
        
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        
<operation name="GetLastTradePrice">
           
<soap:operation soapAction="http://example.com/GetLastTradePrice"/>
           
<input>
               
<soap:body use="literal"/>
           
</input>
           
<output>
               
<soap:body use="literal"/>
           
</output>
        
</operation>
    
</binding>

    
<service name="StockQuoteService">
        
<documentation>My first service</documentation>
        
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
           
<soap:address location="http://example.com/stockquote"/>
        
</port>
    
</service>

</definitions>

SOAP1.1和1.2,基本都在使用,大多数都支持两个版本。

<?xml version="1.0" encoding="UTF-8"?>
<
soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<
soapenv:Body>
   <
ns1:deletePictureService soapenv:encodingStyle="http://schemas.xmlsoap.org  /soap/encoding/" xmlns:ns1="deletePictureService">
  <
id xsi:type="xsd:string">121</id>
  </ns1:deletePictureService>
 </
soapenv:Body>
</
soapenv:Envelope>

2.Axis实现
Axis的介绍这里就不描述了,详见其网站http://ws.apache.org/axis/
下载下来看其文档基本就可以学习了,文档相对比较详细。

3.开发和测试SOAP监控

Axis的错误提示不是很友好,通常会报莫名其妙的错误,但是又不知道错误的原因,这种情况下监控Web Service的运行情况非常有必要,可以通过下面的tcpmornitor.bat实现,具体代码如下:


1 set Axis_Lib=D:"workspace"TestOFBizServices"lib
2 
3 set Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%
4 
5 %Java_Cmd% org.apache.axis.utils.tcpmon


其中的Axis_libAxis自带的lib库,里面有axis运行需要的jar包。

运行tcpmornitor.bat,显示图形界面工具:


输入监听的端口,目标主机和端口,点击“Add”按钮即可。注意的是,目标主机和端口是指实际响应web service的主机和端口,而监听端口是客户端请求的端口。比如web service发布在192.168.22.73:8091上面,那么本地测试时,请求的endpoint中主机和端口必须改成localhost:Listen Port。也就是说TCPMornitor只是一个Proxy,它截获并转发SOAP请求和响应的内容,不做其他处理。增加了监听后,出现监听窗口:


此时启动客户端的web service调用请求,成功处理后,监控窗口会出现本次调用的监控内容:

上下两个窗口分别显示请求内容和相应内容,通过查看SOAP消息可以辅助程序的调试。



Axis在Apache已不再维护,推荐使用http://cxf.apache.org/