web service 的原理以及概念

summary: SOA架构本身是一个虚拟的架构,它不依赖任何的服务组件,包括web service 组件,因为soa可以随意绑定各种服务组件。但是,从另外一个方面来说,web service的逐渐成熟为实施打下了良好的基础。因为web service的soap/http毕竟是一个标准的服务传输协议,从本质上来说,应用集成是离不开标准化的传输协议的。如果说企业内部的软件服务集成可以采用某种非标准化的传输协议的话,那么企业内外服务的集成则需要借助于标准化的服务组件了。
web service 组件不同于其他组件的根本之处在于web service 采用了一种标准传输协议soap。开发服务组件的目的就是要让客户端能够调用其服务。所谓web service就是定义了一套标准的调用过程:

  • 服务器端首先用一套标准的方法向外界描述它所提供的服务的内容,这属于wsdl;
  • 客户端需要以一种标准的协议来调用此服务,这属于soap;
  • 服务提供者将服务内容方在一个公共的网址让大家来查询,这属于uddi;

1.1 命名空间(name space)

web service 是一种基于xml的标准化的服务组件,它会大量地使用命名空间(name space),所以在介绍web service之前,有必要介绍命名空间。

命名空间(name space)是指逻辑上相关的唯一一组名称,其实也不用用这么学术的解释,命名空间不就是和java里面的packege机制还有c++里面的 namespace机制是一样的嘛,就是为了防止不同的人定义了相同的变量名称,整合到一个程序中编译器解析时会遇到命名冲突的问题,所以要在每个人的变量名外面包一层命名空间,相当于给每个符号名字前面隐形的加了一个前缀,这样就能区分开来了。

wsdl有大量地使用命名空间的地方,有必要先简单地介绍一下wsdl中的命名空间。

本质上wsdl是一个xml文件,作为一个xml文件,为了区别同名的元素,就需要采用命名空间的概念。下面用一个示例来说明这个问题。
命名空间示例

假设服务器有两个雷,两个类都有同样的方法名 : method A1 , method A2 为了区分他们,就可以定义两个命名空间 class A 和 Class B 如下:

1
2
3
4
5
<class:class xmlns:classA=http://class/classA xmlns:classB=http://class/classB>
<classA:method A1>
<classA:method A2>
<classB:method A1>
<classB:method A2>

通过上面这个定义,就可以知道每个方法是属于哪个类的了。这样,客户端如果想要调用class A的A1方法和class B的A2方法,就可以这样写:

1
2
<method A1 xmlns="http://class/classA">
<method A2 xmlns="http://class/classB">

一旦服务器收到这样一条消息,它就知道调用class A的 A1方法而不是class B中的同名方法,调用class B中的A2方法而不是class A中的同名方法。

XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix=”namespaceURI”

请访问 http://www.w3.org/TR/html4/

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

默认的命名空间(Default Namespaces)
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
请使用下面的语法:

xmlns=”namespaceURI”

这个 XML 文档携带着某个表格中的信息:

1
2
3
4
5
6
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>


1.2 WSDL的本质:服务内容的标准化描述

WSDL的全称是web service description language,是一种基于xml格式的关于web服务的描述语言,其主要目的在于web service的提供者将自己的web服务的所有相关内容,如所提供服务的传输方式、服务方法接口、接口参数、服务路径等,生成相应的完全的文档,发布给使用者。使用者可以通过这个wsdl文档,创建相应的soap请求(request)消息,通过http传递给web sercive提供者;web 服务在完成服务请求之后,将soap消息返回(response)消息传回请求者,服务请求者再根据wsdl文档将soap返回的消息解析成自己能够理解的内容。

WSDL的目的就是要告诉外界自己能够提供什么样的服务,类似于java的interface。它就是用来描述服务接口的标记语言

学习WSDL请猛戳这里:w3cschool上的WSDL教程


WSDL写法简要介绍

WSDL文档结构
WSDL主要是用来描述某个web service 的:

  • web service执行的操作
  • web service 使用的消息
  • web service 使用的数据类型
  • web service 使用的通信协议

一个WSDL文档的主要结构是类似这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<definitions>
<types>
definition of types ...
</types>
<message>
definition of a message...
</message>
<portType>
definition of a port....
</portType>
<binding>
definition of a binding...
</binding>
</definitions>

WSDL文档可包含其他的元素,比如extension 元素,以及一个service元素,此元素可以把若干个web sercives的定义组合在一个单一的WSDL文档中。

WSDL 端口
<portType> 元素是最重要的 WSDL 元素。
它可描述一个 web service、可被执行的操作,以及相关的消息。
可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。

WSDL 消息
<message> 元素定义一个操作的数据元素。
每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。

WSDL types
<types> 元素定义 web service 使用的数据类型。
为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。

WSDL Bindings
<binding> 元素为每个端口定义消息格式和协议细节。

WSDL 实例
这是某个 WSDL 文档的简化的片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>

在这个例子中,<portType>元素把 “glossaryTerms” 定义为某个端口的名称,把 “getTerm” 定义为某个操作的名称。
操作 “getTerm” 拥有一个名为 “getTermRequest” 的输入消息,以及一个名为 “getTermResponse” 的输出消息。

元素可定义每个消息的部件,以及相关联的数据类型。
对比传统的编程,glossaryTerms 是一个函数库,而 “getTerm” 是带有输入参数 “getTermRequest” 和返回参数 getTermResponse 的一个函数。

WSDL 和 UDDI

UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
UDDI,英文为 “Universal Description, Discovery and Integration”,可译为“通用描述、发现与集成服务”。
UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成。
UDDI 指的是通用描述、发现与集成服务
UDDI 是一种用于存储有关 web services 的信息的目录。
UDDI 是一种由 WSDL 描述的 web services 界面的目录。
UDDI 经由 SOAP 进行通信
UDDI 被构建入了微软的 .NET 平台

WSDL语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<wsdl:definitions name="nmtoken"? targetNamespace="uri">
<import namespace="uri" location="uri"/> *
<wsdl:documentation .... /> ?
<wsdl:types> ?
<wsdl:documentation .... /> ?
<xsd:schema .... /> *
</wsdl:types>
<wsdl:message name="ncname"> *
<wsdl:documentation .... /> ?
<part name="ncname" element="qname"? type="qname"?/> *
</wsdl:message>
<wsdl:portType name="ncname"> *
<wsdl:documentation .... /> ?
<wsdl:operation name="ncname"> *
<wsdl:documentation .... /> ?
<wsdl:input message="qname"> ?
<wsdl:documentation .... /> ?
</wsdl:input>
<wsdl:output message="qname"> ?
<wsdl:documentation .... /> ?
</wsdl:output>
<wsdl:fault name="ncname" message="qname"> *
<wsdl:documentation .... /> ?
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:serviceType name="ncname"> *
<wsdl:portType name="qname"/> +
</wsdl:serviceType>
<wsdl:binding name="ncname" type="qname"> *
<wsdl:documentation .... /> ?
<-- binding details --> *
<wsdl:operation name="ncname"> *
<wsdl:documentation .... /> ?
<-- binding details --> *
<wsdl:input> ?
<wsdl:documentation .... /> ?
<-- binding details -->
</wsdl:input>
<wsdl:output> ?
<wsdl:documentation .... /> ?
<-- binding details --> *
</wsdl:output>
<wsdl:fault name="ncname"> *
<wsdl:documentation .... /> ?
<-- binding details --> *
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ncname" serviceType="qname"> *
<wsdl:documentation .... /> ?
<wsdl:port name="ncname" binding="qname"> *
<wsdl:documentation .... /> ?
<-- address details -->
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Comments

⬆︎TOP