Web Service入门教程.docx
《Web Service入门教程.docx》由会员分享,可在线阅读,更多相关《Web Service入门教程.docx(22页珍藏版)》请在冰豆网上搜索。
![Web Service入门教程.docx](https://file1.bdocx.com/fileroot1/2023-1/29/319bfa0a-9a4d-436e-82cd-d56b229f3675/319bfa0a-9a4d-436e-82cd-d56b229f36751.gif)
WebService入门教程
WebService概述
WebService的定义
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。
WebService服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。
这里我们从一个程序员的视角来观察webservice。
在传统的程序编码中,存在这各种的函数方法调用。
通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行完毕后,返回处理结果R。
这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。
现在的我们需要一种能够在不同计算机间的不同语言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Webservice正是应这种需求而诞生的。
最普遍的一种说法就是,WebService=SOAP+HTTP+WSDL。
其中,SOAPSimpleObjectAccessProtocol)协议是webservice的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的计算服务处理。
这里的WSDL(WebServicesDescriptionLanguage)web服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的Webservice服务的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消息必须使用SOAPEnvelope命名空间
SOAP消息必须使用SOAPEncoding命名空间
SOAP消息不能包含DTD引用
SOAP消息不能包含XML处理指令
SOAP消息的基本结构
XML/HTML代码
1.
xml version="1.0"?
>
2.Envelope
3.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
4.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
5.Header>
6. ...
7. ...
8.
Header>
9.Body>
10. ...
11. ...
12. Fault>
13. ...
14. ...
15.
Fault>
16.
Body>
17.
Envelope>
SOAPEnvelope元素
Envelope元素是SOAP消息的根元素。
它指明XML文档是一个SOAP消息。
它的属性xmlns:
soap的值必须是http:
//www.w3.org/2001/12/soap-envelope。
encodingStyle属性,语法:
soap:
encodingStyle="URI"
encodingStyle属性用于定义文档中使用的数据类型。
此属性可出现在任何SOAP元素中,并会被应用到元素的内容及元素的所有子元素上。
XML/HTML代码
1.
xml version="1.0"?
>
2.Envelope
3.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
4.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
5. ...
6. Message information goes here
7. ...
8.
Envelope>
SOAPHeader元素
actor属性,语法soap:
actor="URI"
通过沿着消息路径经过不同的端点,SOAP消息可从某个发送者传播到某个接收者。
并非SOAP消息的所有部分均打算传送到SOAP消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。
SOAP的actor属性可被用于将Header元素寻址到一个特定的端点。
mustUnderstand属性,语法soap:
mustUnderstand="0|1"
SOAP的mustUnderstand属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。
假如您向Header元素的某个子元素添加了"mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。
XML/HTML代码
1.
xml version="1.0"?
>
2.Envelope
3.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
4.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
5.Header>
6.Trans
7.xmlns:
m="
8.soap:
mustUnderstand="1"
9.soap:
actor=" “ >234
Trans>
10.
Header>
11....
12....
13.
Envelope>
SOAPBody元素
必需的SOAPBody元素可包含打算传送到消息最终端点的实际SOAP消息。
Body元素中既可以包含SOAP定义的命名空间中的元素,如Fault,也可以是用户的应用程序自定义的元素。
以下是一个用户定义的请求:
XML/HTML代码
1.
xml version="1.0"?
>
2.Envelope
3.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
4.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
5.Body>
6. GetPrice xmlns:
m="
7. Item>Apples
Item>
8.
GetPrice>
9.
Body>
10.
Envelope>
上面的例子请求苹果的价格。
请注意,上面的m:
GetPrice和Item元素是应用程序专用的元素。
它们并不是SOAP标准的一部分。
而对应的SOAP响应应该类似这样:
SOAPFault元素
Fault元素表示SOAP的错误消息。
它必须是Body元素的子元素,且在一条SOAP消息中,Fault元素只能出现一次。
Fault元素拥有下列子元素:
常用的SOAPFaultCodes
HTTP协议中的SOAP实例
下面的例子中,一个GetStockPrice请求被发送到了服务器。
此请求有一个StockName参数,而在响应中则会返回一个Price参数。
此功能的命名空间被定义在此地址中:
"
SOAP请求:
(注意HTTP的Head属性)
XML/HTML代码
1.POST /InStock HTTP/1.1
2.Host:
3.Content-Type:
application/soap+xml; charset=utf-8
4.Content-Length:
XXX
5.
6.
xml version="1.0"?
>
7.Envelope
8.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
9.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
10. Body xmlns:
m="
11. GetStockPrice>
12. StockName>IBM
StockName>
13.
GetStockPrice>
14.
Body>
15.
Envelope>
SOAP响应:
(注意HTTP的Head属性)
XML/HTML代码
1.HTTP/1.1 200 OK
2.Content-Type:
application/soap+xml; charset=utf-8
3.Content-Length:
XXX
4.
5.
xml version="1.0"?
>
6.Envelope
7.xmlns:
soap="http:
//www.w3.org/2001/12/soap-envelope"
8.soap:
encodingStyle="http:
//www.w3.org/2001/12/soap-encoding">
9. Body xmlns:
m="
10. GetStockPriceResponse>
11. Price>34.5
Price>
12.
GetStockPriceResponse>
13.
Body>
14.
Envelope>
HTTP协议中的SOAPRPC工作流程
WSDL简介
介绍过了SOAP,让我们关注WebService中另外一个重要的组成WSDL。
WSDL的主要文档元素
WSDL文档可以分为两部分。
顶部分由抽象定义组成,而底部分则由具体描述组成。
抽象部分以独立于平台和语言的方式定义SOAP消息,它们并不包含任何随机器或语言而变的元素。
这就定义了一系列服务,截然不同的应用都可以实现。
具体部分,如数据的序列化则归入底部分,因为它包含具体的定义。
在上述的文档元素中,、、属于抽象定义层,、属于具体定义层。
所有的抽象可以是单独存在于别的文件中,也可以从主文档中导入。
WSDL文档的结构实例解析
下面我们将通过一个实际的WSDL文档例子来详细说明各标签的作用及关系。
XML/HTML代码
1.
xml version="1.0" encoding="UTF-8"?
>
2.3. xmlns:
soap="http:
//schemas.xmlsoap.org/wsdl/soap/"
4. xmlns:
tns="
5. xmlns:
xsd="http:
//www.w3.org/2001/XMLSchema"
6. xmlns="http:
//schemas.xmlsoap.org/wsdl/"
7. targetNamespace="
8. name="Example">
9.
10.
11. schema>
12. import
13. namespace="
14. schemaLocation="http:
//localhost:
8080/hello?
xsd=1">
import>
15.
schema>
16.
17.
18.
19. string">
20.
21.
22. string">
23.
24.
25.
26. person">
27. string">
28.
29.
30. personArray">
31.
32.
33. HelloException">
34.
35.
36.
37.
38.
toSayHello">
39.
40.
41.
42.
sayHello">
43.
44. HelloException" name="HelloException">
45.
46.
47.
48.Example">
49. binding
50. transport="http:
//schemas.xmlsoap.org/soap/http"
51. style="rpc">
binding>
52.
53. operation soapAction="sayHello">
operation>
54.
55. body use="literal"
56. namespace="
57.
58.
59. body use="literal"
60. namespace="
61.
62.
63.
64. operation soapAction="sayHello">
operation>
65.
66. body use="literal"
67. namespace="
68.
69.
70. body use="literal"
71. namespace="
72.
73.
74. fault name="HelloException" use="literal">
fault>
75.
76.
77.
78.
79.
80. ExamplePortBinding">
81. address location="http:
//localhost:
8080/hello">
address>
82.
83.
84.
由于上面的事例XML较长,我们将其逐段分解讲解
WSDL文档的根元素:
<definitions>
XML/HTML代码
1.2. xmlns:
soap="http:
//schemas.xmlsoap.org/wsdl/soap/"
3. xmlns:
tns="
4. xmlns:
xsd="http:
//www.w3.org/2001/XMLSchema"
5. xmlns="http:
//schemas.xmlsoap.org/wsdl/"
6. targetNamespace="
7. name="Example">
8.……
9.……
10.
<definitions>定义了文档中用到的各个xml元素的namespace缩写,也界定了本文档自己的targetNamespace="
引用
WSDL文档数据类型定义元素:
XML/HTML代码
1.
2. schema>
3. import
4. namespace="
5. schemaLocation="http:
//localhost:
8080/hello?
xsd=1">
import>
6.
schema>
7.
标签定义了当前的WSDL文档用到的数据类型。
要说明的是,为了最大程度的平台中立性,WSDL使用XMLSchema语法来定义数据类型。
这些数据类型用来定义webservice方法的参数和返回指。
对于通用的原生数据类型如:
integer,boolean,char,float等,在W3C的标准文档http:
//www.w3.org/2001/XMLSchema中已经做了定义。
这里我们要引入的schema定义schemaLocation="http:
//localhost:
8080/hello?
xsd=1"是我们自定义的Java对象类型。
WSDL文档消息体定义元素:
XML/HTML代码
1.
2. string">
3.
4.
5. string">
6