Web Service学习笔记
博客专区 > tao975 的博客 > 博客详情
Web Service学习笔记
tao975 发表于3年前
Web Service学习笔记
  • 发表于 3年前
  • 阅读 133
  • 收藏 4
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 简单说,Web Service是一种跨编程语言和跨操作系统平台的远程调用技术。

一、Web Service定义

    简单说,Web Service是一种跨编程语言和跨操作系统平台的远程调用技术。
     从表面上看,Web Service就是一个向外界提供API,供其他地方通过Web方式来调用API的应用程序。我们把提供Web Service的应用程序叫做服务端,把调用Web Service的应用程序叫做客户端。从深层次看,Web Service是建立可互操作的分布式应用程序的新平台,是一个平台,是一套标准。它定义了应用程序如何在Web上实现互操作性,你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。 
    从程序员的角度讲,Web Service就是我们可以直接调用远程服务端的方法,得到该方法的返回值。

二、为什么使用Web Service

1. 跨平台跨语言
    Web Service采用Internet上的统一、开放的标准,比如HTTP、XML、SOAP协议等,所以它可以在任何支持这些标准的平台上使用。
2. 跨防火墙通信
    客户端和服务器之间通常会有防火墙或代理服务器,而Web Service使用HTTP协议,使数据能够容易通过防火墙,不需要防火墙为程序单独开一个漏洞。
3. 方便应用程序集成
    在企业级应用中常常需要把不同平台、不同语言开发的程序集成起来,通过Web Service,应用程序可以把功能和数据封装成统一标准的开放形式,以供其他程序使用。
4. B2B的集成
    用WebService来实现B2B集成的最大好处在于可以轻易实现互操作性。只要把商务逻辑“暴露”出来,成为WebService,就可以让任何指定的合作伙伴调用这些商务逻辑,而不管他们的系统在什么平台上运行,使用什么开发语言。这样就大大减少了花在B2B集成上的时间和成本。

三、Web Service的缺点

1. WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。  
2. Web Service不适用于单机应用程序。
    目前,企业和个人还使用着很多桌面应用程序。其中一些只需要与本机上的其它程序通信。在这种情况下,最好就不要用WebService,只要用本地的API就可以了。
3 Web Service不适用于局域网的同构应用程序。
    在许多应用中,所有的程序都是用VB或VC开发的,都在Windows平台下使用COM,都运行在同一个局域网上。例如,有两个服务器应用程序需要相互通信,或者有一个Win32或WinForm的客户程序要连接局域网上另一个服务器的程序。在这些程序里,使用DCOM会比SOAP/HTTP有效得多。

四、Web Service 元素

     XML+XSD,SOAP和WSDL是构成WebService平台的三大技术。

XML+XSD

WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。XML是WebService平台中表示数据的格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。 
    XML解决了数据表示的问题,但它没有定义一套标准的数据类型,更没有说怎么去扩展这套数据类型。例如,整形数到底代表什么?16位,32位,64位?这些细节对实现互操作性很重要。XML Schema(XSD)就是专门解决这个问题的一套标准。它定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。WebService平台就是用XSD来作为其数据类型系统的。当你用某种语言(如VB.NET或C#)来构造一个Web service时,为了符合WebService标准,所有你使用的数据类型都必须被转换为XSD类型。你用的工具可能已经自动帮你完成了这个转换,但你很可能会根据你的需要修改一下转换过程。
        
SOAP协议
        
1. 什么是SOAP协议

    SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档。
    WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。

    SOAP协议 = HTTP协议 + XML数据格式

    SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。打个比喻:HTTP就是普通公路,XML就是中间的绿色隔离带和两边的防护栏,SOAP就是普通公路经过加隔离带和防护栏改造过的高速公路。

    它包括四个部分:
    1)SOAP封装(envelop):封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
    2)SOAP编码规则(encoding rules):用于表示应用程序需要使用的数据类型的实例; 
    3)SOAP RPC表示(RPC representation):表示远程过程调用和应答的协定;
    4)SOAP绑定(binding):使用底层协议交换信息。

 2. SOAP消息的基本结构
<? xml version="1.0"?>   
        <soap:Envelope   xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">   
            <soap:Header>   
                ...   
            </soap:Header>   
            <soap:Body>   
                ...   
                <soap:Fault>   
                    ...   
                </soap:Fault>   
            </soap:Body>   
         </soap:Envelope>
     1)Envelope:标识XML 文档一条 SOAP 消息 。Envelope 元素是 SOAP 消息的根元素。它指明 XML 文档是一个SOAP 消息。
  • xmlns:soap属性:值必须是http://www.w3.org/2001/12/soap-envelope。 
  • encodingStyle 属性:语法:soap:encodingStyle="URI" 。encodingStyle 属性用于定义文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。 
     2) Header:包含头部信息的XML标签 
  • actor 属性:语法soap:actor="URI",通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。 
  • mustUnderstand 属性:语法soap:mustUnderstand="0|1",可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。 
    3) Body:包含所有的调用和响应的主体信息的标签。
    4) Fault:错误信息标签,Fault 元素只能出现一次。 

3. HTTP协议中的SOAP 实例

    下面的例子中,一个 sayHelloToPerson 请求被发送到了服务器。此请求有一个 name 参数,而在响应中则会返回 return 值。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:axis="http://ws.apache.org/axis2">
           <soapenv:Header/>
           <soapenv:Body>
              <axis:sayHelloToPerson>
                 <!--Optional:-->
                 <name>Mike</name>
              </axis:sayHelloToPerson>
           </soapenv:Body>
        </soapenv:Envelope>
    2)SOAP响应:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
           <soapenv:Body>
              <ns:sayHelloToPersonResponse xmlns:ns="http://ws.apache.org/axis2">
                 <return>hello,Mike</return>
              </ns:sayHelloToPersonResponse>
           </soapenv:Body>
        </soapenv:Envelope>
WSDL简介

1. 什么是WSDL

    WSDL(Web Service Description Language)Web Service描述语言就是对一个web service的描述,用于描述Web Service及其函数、参数和返回值。 在开发的时候正确的做法是先写好WSDL 然后根据这个WSDL来开发相应的服务端和客服端.。不过国内好像都是先写一个WEB SERVICE 然后再去生成WSDL。
    WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。
    WSDL文档可以分为两部分:
    1)顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。
    2)具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元素中,<types>、<message>、<portType>属于抽象定义层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。

2. WSDL文档结构  
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://ws.apache.org/axis2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://ws.apache.org/axis2">
<wsdl:types>
    <xs:schema attributeFormDefault="qualified" elementFormDefault="unqualified" targetNamespace="http://ws.apache.org/axis2">
        <xs:element name="sayHelloToPerson">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="sayHelloToPersonResponse">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="sayHello">
            <xs:complexType>
                <xs:sequence/>
            </xs:complexType>
        </xs:element>
        <xs:element name="sayHelloResponse">
            <xs:complexType>
                <xs:sequence>
                    <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
</wsdl:types>
<wsdl:message name="sayHelloRequest">
    <wsdl:part name="parameters" element="ns:sayHello"/>
</wsdl:message>
<wsdl:message name="sayHelloResponse">
    <wsdl:part name="parameters" element="ns:sayHelloResponse"/>
</wsdl:message>
<wsdl:message name="sayHelloToPersonRequest">
    <wsdl:part name="parameters" element="ns:sayHelloToPerson"/>
</wsdl:message>
<wsdl:message name="sayHelloToPersonResponse">
    <wsdl:part name="parameters" element="ns:sayHelloToPersonResponse"/>
</wsdl:message>
<wsdl:portType name="HelloServicePortType">
    <wsdl:operation name="sayHello">
        <wsdl:input message="ns:sayHelloRequest" wsaw:Action="urn:sayHello"/>
        <wsdl:output message="ns:sayHelloResponse" wsaw:Action="urn:sayHelloResponse"/>
    </wsdl:operation>
    <wsdl:operation name="sayHelloToPerson">
        <wsdl:input message="ns:sayHelloToPersonRequest" wsaw:Action="urn:sayHelloToPerson"/>
        <wsdl:output message="ns:sayHelloToPersonResponse" wsaw:Action="urn:sayHelloToPersonResponse"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloServiceSoap11Binding" type="ns:HelloServicePortType">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="sayHello">
        <soap:operation soapAction="urn:sayHello" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="sayHelloToPerson">
        <soap:operation soapAction="urn:sayHelloToPerson" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="HelloServiceSoap12Binding" type="ns:HelloServicePortType">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
    <wsdl:operation name="sayHello">
        <soap12:operation soapAction="urn:sayHello" style="document"/>
        <wsdl:input>
            <soap12:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap12:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="sayHelloToPerson">
        <soap12:operation soapAction="urn:sayHelloToPerson" style="document"/>
        <wsdl:input>
            <soap12:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap12:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:binding name="HelloServiceHttpBinding" type="ns:HelloServicePortType">
    <http:binding verb="POST"/>
    <wsdl:operation name="sayHello">
        <http:operation location="sayHello"/>
        <wsdl:input>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="sayHelloToPerson">
        <http:operation location="sayHelloToPerson"/>
        <wsdl:input>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:input>
        <wsdl:output>
            <mime:content type="application/xml" part="parameters"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloService">
    <wsdl:port name="HelloServiceHttpSoap11Endpoint" binding="ns:HelloServiceSoap11Binding">
        <soap:address location="http://localhost:8080/axis2/services/HelloService.HelloServiceHttpSoap11Endpoint/"/>
    </wsdl:port>
    <wsdl:port name="HelloServiceHttpSoap12Endpoint" binding="ns:HelloServiceSoap12Binding">
        <soap12:address location="http://localhost:8080/axis2/services/HelloService.HelloServiceHttpSoap12Endpoint/"/>
    </wsdl:port>
    <wsdl:port name="HelloServiceHttpEndpoint" binding="ns:HelloServiceHttpBinding">
        <http:address location="http://localhost:8080/axis2/services/HelloService.HelloServiceHttpEndpoint/"/>
    </wsdl:port>
</wsdl:service>
</wsdl:definitions>
    1)<definitions>:WSDL文档的根元素。<definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的targetNamespace="http://www.jsoso.com/wstest",这意味着其它的XML要引用当前XML中的元素时,要声明这个namespace。注意xmlns:tns="http://www.jsoso.com/wstest"这个声明,它标示了使用tns这个前缀指向自身的命名空间。 
    2)<types>:定义了当前的WSDL文档用到的数据类型。要说明的是,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。这些数据类型用来定义web service方法的参数和返回指。对于通用的原生数据类型如:integer , boolean , char , float等,在W3C的标准文档http://www.w3.org/2001/XMLSchema中已经做了定义。这里我们要引入的schema定义schemaLocation="http://localhost:8080/hello?xsd=1"是我们自定义的Java对象类型。 
    3)<message>:定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类型属性,就像函数的参数有参数名和参数类型。<message>元素定义了web service函数的参数。<message>元素中的每个<part>子元素都和某个参数相符。输入参数在<message>元素中定义,与输出参数相隔离,输出参数有自己的<message>元素。兼作输入、输出的参数在输入输出的<message>元素中有它们相应的<part>元素。输出<message>元素以"Response"结尾,对Java而言方法得返回值就对应一个输出的<message>。每个<part>元素都有名字和类型属性,就像函数的参数有参数名和参数类型。
    4) < portType >:是最重要的 WSDL 元素。它可描述一个 web service、可被执行的操作,以及相关的消息。portType的name属性对应Java中的一个服务类的类名。<portType> 元素使用其子元素< operation>描述一个web service的服务方法。 
在<operation>元素中,name属性表示服务方法名,parameterOrder属性表示方法的参数顺序,使用空格符分割多个参数,如:“parameterOrder="person arg1”。<operation>元素的子标签<input>表示输入参数说明,它引用<message>标签中的输入参数。<output>表示输出参数说明,它引用<message>标签中的输出参数。<fault>标签在Java方法中的特别用来表示异常(其它语言有对应的错误处理机制),它引用<message>标签中的错误参数。  
    5) < binding >:是完整描述协议、序列化和编码的地方,<types>,<message>和<portType>标签处理抽象的数据内容,而<binding>标签是处理数据传输的物理实现。 
<binding>标签把前三部分的抽象定义具体化。  
首先<binding>标签使用<soap:binding>的transport和style属性定义了Web Service的通讯协议HTTP和SOAP的请求风格RPC。其次<operation>子标签将portType中定义的operation同SOAP的请求绑定,定义了操作名称soapAction,输出输入参数和异常的编码方式及命名空间。  
    6)< service >:是一套<port>元素。在一一对应形式下,每个<port>元素都和一个location关联。如果同一个<binding>有多个<port>元素与之关联,可以使用额外的URL地址作为替换。 
一个WSDL文档中可以有多个<service>元素,而且多个<service>元素十分有用,其中之一就是可以根据目标URL来组织端口。在一个WSDL文档中,<service>的name属性用来区分不同的service。在同一个service中,不同端口,使用端口的"name"属性区分。  

五、Web Service 实现

1. JavaSE6.0下的Web Service

    从JavaSE6.0开始,Java引入了对Web Service的原生支持。我们只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service。
    但不是所有的Java类都可以发布成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则: 
  • 这个类必须是public类
  • 这些类不能是final的或者abstract
  • 这个类必须有一个公共的默认构造函数
  • 这个类绝对不能有finalize()方法

    1)Web Service 服务端代码
package com.tsingsoft.service;
        import javax.jws.WebMethod;
        import javax.jws.WebParam;
        import javax.jws.WebResult;
        import javax.jws.WebService;
        import javax.jws.soap.SOAPBinding;

        /**
         * 提供WebService服务的类
         */
        @WebService(name = "HelloService", targetNamespace = "http://www.tsingsoft.com/wstest", serviceName = "HelloService")
        @SOAPBinding(style = SOAPBinding.Style.RPC)
        public class HelloService {

            /**
              * sayHello
              * @return
              */
            @WebMethod(operationName = "sayHello", action = "sayHello", exclude = false)
            @WebResult(name = "returnWord")
            // 自定义该方法返回值在WSDL中相关的描述
            public String sayHello() {
                return "Hello";
            }
    
            /**
             * sayHelloToPerson
             * @param name
              * @return
             */
            @WebMethod(operationName = "sayHelloToPerson", action = "sayHelloToPerson", exclude = false)
            @WebResult(name = "returnWord")
            // 自定义该方法返回值在WSDL中相关的描述
            public String sayHelloToPerson(@WebParam(name = "name") String name) {
                return "Hello:" + name;
            }
    }
    2)Web Service 发布代码
package com.tsingsoft.service;
        import javax.xml.ws.Endpoint;
        /**
         * 启动web services服务
         * 
         * @author 陶金贵
         * @since 2015-3-2 下午2:07:41
         * @version
         */
        public class StartServer {

            /**
             * @param args
             */
            public static void main(String[] args) {
                /*
                 * 生成Example 服务实例
                 */
                HelloService serverBean = new HelloService();
                /*
                 * 发布Web Service到http://localhost:8080/hello地址
                 */
                Endpoint.publish("http://localhost:8080/hello", serverBean);
            }
        }
    在控制台运行这个类,使用http://localhost:8080/hello?wsdl 查看WSDL全文。

    3)Web Service 客户端代码

     这里我们要使用到JDK中的另一个命令行工具wsimport。在控制台下进入项目根目录,输入以下命令: 
    wsimport -d ./bin -s ./src -p com.tsingsoft.client http://localhost:8080/hello?wsdl

    即可在包 com.tsingsoft.client 中生成客户端的存根及框架文件。其中我们要使用的类只有两个:服务类 HelloService_Service 和本地接口 HelloService 。编写如下客户端,即可调用Web Service服务:  
package com.tsingsoft.client;
        /**
         * Web Service 客户端
         *
         * @author 陶金贵
         * @since 2015-3-11 下午1:48:25
         * @version
         */
        public class HelloClient {
            /**
              * @param args
              */
             public static void main(String[] args) {
                  // 初始化服务框架类
                  HelloService_Service service = new HelloService_Service();
                  // 或者本地服务借口的实例
                  HelloService server = (HelloService) service.getHelloServicePort();
                  try {
                       // 调用web service的sayHello方法
                       System.out.println("sayHello的返回值:" + server.sayHello());
                       // 调用web service的sayHello方法
                       System.out.println("sayHelloToPerson的返回值:" + server.sayHelloToPerson("Mike"));
                  }
                  catch (Exception e) {
                       e.printStackTrace();
                  }
             }
        }
2. Axis2创建Web Service 

    1)Axis2的下载和安装
    从 http://ws.apache.org/axis2/   下载Axis2的最新版本:
    axis2-xxx-bin.zip:包含Axis2所有jar文件
    axis2-xxx-war.zip: 用于将WebService发布到Web容器中

     将axis2-xxx-war.zip文件解压到相应的目录,将目录中的axis2.war文件放到<Tomcat安装目录>\webapps目录中,并启动Tomcat,在浏览器地址栏中输入URL: http://localhost:8080/axis2/ ,如看到axis2的主页面则安装成功。

    2)Web Service 服务端


/**
             * WebService 服务端
             * @author 陶金贵
             * @since 2015-3-2 上午11:32:26
             * @version
             */
            public class HelloService {
                 public String sayHello() {
                     return "hello";
                 }
                 public String sayHelloToPerson(String name) {
                      if (name == null) {
                           name = "nobody";
                      }
                      return "hello," + name;  }
            }

    Web Service 服务端有两种发布方式:

    (1)用POJO形式发布(POJO类不能使用package关键字声明包

            编译HelloService类后,将HelloService.class文件放到<Tomcat安装目录>\webapps\axis2\WEB-INF\pojo目录中(如果没有pojo目录,则建立该目录)。现在我们已经成功将HelloService类发布成了WebService。

         在浏览器地址栏中输入URL显示Service发布情况: http://localhost:8080/axis2/services/listServices

         在浏览器地址栏中输入如下的两个URL来分别测试sayHelloToPerson和sayHello方法:
         http://localhost:8080/axis2/services/HelloService/sayHello  

    (2)使用services.xml配置文件发布

            用Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便.
           为此,Axis2也允许将带包的POJO类发布成Web Service。 要想将HelloServiceNew类发布成Web Service,需要一个services.xml文件, 这个文件需要放在META-INF目录中,该文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?>  
            <service name="HelloServiceNew">  
                <description>  
                    Web Service例子  
                </description>  
                <parameter name="ServiceClass">  
                     com.tsingsoft.webservice.HelloService
                </parameter>  
                <messageReceivers>  
                    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"  
                        class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
                    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"  
                        class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />  
                </messageReceivers>  
            </service>
         使用这种方式发布WebService,必须打包成.aar文件,.aar文件实际上就是改变了扩展名的.jar文件。
        现在建立了两个文件:HelloServiceNew.java和services.xml。
        将HelloServiceNew.java编译,生成HelloServiceNew.class。
        services.xml和HelloServiceNew.class文件的位置如下:
        D:\ws\ com\sinosoft\webservice\HelloServiceNew.class
        D:\ws\META-INF\services.xml
        在windows控制台中进入ws目录,并输入如下的命令生成.aar文件.

        jar cvf ws.aar .

        实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice.
        最后将ws.aar文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以调用这个WebService了。

    3)Web Service 客户端

import javax.xml.namespace.QName;
        import org.apache.axis2.AxisFault;
        import org.apache.axis2.addressing.EndpointReference;
        import org.apache.axis2.client.Options;
        import org.apache.axis2.rpc.client.RPCServiceClient;

        /**
         * WebService 客户端
         * @author 陶金贵
         * @since 2015-3-2 上午11:57:06
         * @version
         */
        public class HelloClient {

            public static void main(String args[]) throws AxisFault {
                // 使用RPC方式调用WebService
                RPCServiceClient serviceClient = new RPCServiceClient();
                Options options = serviceClient.getOptions();
                // 指定调用WebService的URL
               EndpointReference targetEPR = new EndpointReference(
                      "http://localhost:8080/axis2/services/HelloService?wsdl");
                options.setTo(targetEPR);
                // 指定要调用的sayHelloToPerson方法及WSDL文件的命名空间
                QName opAddEntry = new QName("http://ws.apache.org/axis2", "sayHelloToPerson");
                // 指定sayHelloToPerson方法的参数值
                Object[] opAddEntryArgs = new Object[] { "Mike" };

                // 指定sayHelloToPerson方法返回值的数据类型的Class对象
                Class[] classes = new Class[] { String.class };

                // 调用sayHelloToPerson方法并输出该方法的返回值
                String result = (String)serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0];

                System.out.println(result);
           }
        }


六、Web Service测试工具:SoapUI

1. SoapUI介绍

    SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。

2. 创建工程

    安装并运行SoapUI之后,你就可以创建第一个SoapUI工程了。程序第一次打开时,左侧导航面板上,自动有一个空的Projects工程。右击左侧导航面板中的工作空间节点“Projects”,选择 “New Soap Project”。

    页面弹出“New SoapUI Project”TAB页,填入Project Name,Initial WSDL/WADL可填入URL地址或直接导入WSDL文件,点击确定,显示该Web Service 提供的全部方法。

    

    双击HelloToPerson下的Request1,弹出请求编辑器,请求编辑器分为三部分:  

    1)顶部的工具栏,包含一组请求相关的动作、操作  

    2)左边是请求区域  

    3)右边是响应区域 

    在请求编辑框内,“?”表示可以传递的参数,修改“?”并点击左上角绿色三角形按钮,提交请求,在右边则会显示响应的内容




参考资料:

Web Service学习笔记 :http://blog.csdn.net/qjyong/article/details/2148558

为什么使用WebService :http://blog.csdn.net/superjj01/article/details/5270227

Axis2创建WebService实例 :http://clq9761.iteye.com/blog/976029














共有 人打赏支持
粉丝 2
博文 10
码字总数 34471
×
tao975
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: