web service札记
web service笔记转自:http://blog.csdn.net/qjyong/article/details/2148558?Web Service的定义?W3C组织对
web service笔记
转自:http://blog.csdn.net/qjyong/article/details/2148558
?
Web Service的定义?
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。?
这里我们从一个程序员的视角来观察web service。在传统的程序编码中,存在这各种的函数方法调用。通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行完毕后,返回处理结果R。这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。现在的我们需要一种能够在不同计算机间的不同语言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Web service正是应这种需求而诞生的。?
最普遍的一种说法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的计算服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。?
下面,我们先来熟悉一下SOAP协议,看看它是如何描述程序中的函数方法、参数及结果对象的。?
SOAP协议简介?
什么是SOAP?
SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:?
? Envelope 元素,标识XML 文档一条 SOAP 消息?
? Header 元素,包含头部信息的XML标签?
? Body 元素,包含所有的调用和响应的主体信息的标签?
? Fault 元素,错误信息标签。?
以上的元素都在 SOAP的命名空间http://www.w3.org/2001/12/soap-envelope中声明;?
SOAP的语法规则?
? SOAP 消息必须用 XML 来编码?
? SOAP 消息必须使用 SOAP Envelope 命名空间?
? SOAP 消息必须使用 SOAP Encoding 命名空间?
? SOAP 消息不能包含 DTD 引用?
? SOAP 消息不能包含 XML 处理指令?
SOAP 消息的基本结构?
?
常用的SOAP Fault Codes?
?
HTTP协议中的SOAP 实例?
下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.jsoso.net/stock"?
SOAP 请求:(注意HTTP的Head属性)
?
WSDL简介?
介绍过了SOAP,让我们关注Web Service中另外一个重要的组成WSDL。?
WSDL的主要文档元素?
?
WSDL文档可以分为两部分。顶部分由抽象定义组成,而底部分则由具体描述组成。抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。这就定义了一系列服务,截然不同的应用都可以实现。具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。在上述的文档元素中,<types>、<message>、<portType>属于抽象定义层,<binding>、<service>属于具体定义层。所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。?
WSDL文档的结构实例解析?
下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。?
属性operationName匹配的wsdl:operation 的名称,如<operation name="toSayHello" parameterOrder="userName">?
属性exclude 用于阻止将某一继承方法公开为web服务,默认为false?
Annotation 4:@WebResult(name="returnWord")?
@ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" />?
Annotation 5:@WebParam(partName="person", mode=Mode.IN?
@WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT?
这里要着重说明的是,上述Web Service类的sayHello方法中,带有HelloException这个异常声明,造成该服务类不能直接发布成Web Service。需要使用wsgen工具为其生存异常Bean。关于wsgen工具的使用,请参考wsgen与wsimport命令说明?
发布一个的Java Web Service?
在完成了上述的Web Service Annotation注释后,我们使用wsgen工具为其进行服务资源文件的构造(这里主要是生成一个名为org.jsoso.jws.server.jaxws.HelloExceptionBean的异常bean类),最后使用以下的类发布Web 服务:?
????}??- }??
届此,本次Web Service的学习暂告一个段落。Java Web Service是一个相当庞大的知识体系,其中涉及的相关技术较多,这里无法一一道来,我们将会在今后的开发和使用中,同大家做进一步深入的探讨和学习。?
附录:wsgen与wsimport命令说明?
wsgen?
wsgen是在JDK的bin目录下的一个exe文件(Windows版),该命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,wsgen还能辅助生成WSDL和相关的xsd文件。wsgen从资源文件生成一个完整的操作列表并验证web service是否合法,可以完整发布。?
命令参数说明:?
? -cp 定义classpath? -r 生成 bean的wsdl文件的存放目录? -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)? -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)
命令范例:wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl org.jsoso.jws.server.Example?
wsimport?
wsimport也是在JDK的bin目录下的一个exe文件(Windows版),主要功能是根据服务端发布的wsdl文件生成客户端存根及框架,负责与Web Service 服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。对Java而言,wsimport帮助程序员生存调用web service所需要的客户端类文件.java和.class。要提醒指出的是,wsimport可以用于非Java的服务器端,如:服务器端也许是C#编写的web service,通过wsimport则生成Java的客户端实现。?
命令参数说明:?
? -d 生成客户端执行类的class文件的存放目录? -s 生成客户端执行类的源文件的存放目录? -p 定义生成类的包名
命令范例:wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl ?