名词解释
EndPoint : 端点 http://www.bisoft.tl/services/HelloService
Operation : 操作 hello
NameSpace : 命名空间 http://www.bisoft.tl/ns
LocalName : 本地命名 hello
QName : 完全限定名 hello in http://www.bisoft.tl/ns
端点指位置,而命名空间与位置是不同概念。虽然命名空间也类似网址的形式,但实际这个网址只是作为唯一的ID用来区分名称相同的操作。
XML Schema basic data type : XML Schema 基本数据类型
LocalName DataType
----------------------------------------------------
string string in http://www.w3.org/2001/XMLSchema
int integer in http://www.w3.org/2001/XMLSchema
Parameters : 参数 msg:string
Return : 返回值 code:int
实际上,在WS中,我们把 input message 叫方法调用 ,而 part 代表参数, 而返回值叫 output message。
一个操作如下:
operation
---------------------
LocalName : hello
NameSpace : http://www.bisoft.tl/ns
Input Message:
Part 1:
Name : msg
Type : string in http://www.w3.org/2001/XMLSchema
OutputMessage:
Part 1:
Name : code
Type : int in http://www.w3.org/2001/XMLSchema
调用方法的请求如下:
request to hello
------------------------
<foo:hello xmlns:foo="http://www.bisoft.tl/ns">
<msg>hello world!</msg>
</foo:hello>
foo 代表命名空间的前缀。
实际上由于没有在任何SCHEMA中声明msg 类型,因此要显式声明。
<foo:hello xmlns:foo="http://www.bisoft.tl/ns" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-INSTANCE">
<msg xsi:type="xsd:string">Hello World!</msg>
</foo:hello>
调用方法返回的响应如下:
response from hello
------------------------
<foo:hello xmlns:foo="http://www.bisoft.tl/ns">
<code>1</code>
</foo:hello>
上面介绍的这种RPC STYLE叫RPC风格(样式)。
RPC : 远程方法调用。
RPC不是唯一设计WS的方法,下面介绍DOCUMENT STYLE文档风格(样式)。
上面的参数只能是简单的类型,其实可以创建复杂的类型。
下面使用XSD创建一个新的HelloRequest, HelloResponse元素。
<xsd:schema targetNameSpace="http://www.bisoft.tl/ns" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="HelloRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="msg" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="HelloResponse">
<xsd:complexType>
<xsd:element name="code" type="xsd:int" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
同时修改操作:
operation
---------------------
LocalName : hello
NameSpace : http://www.bisoft.tl/ns
Input Message:
Part 1:
Name : HelloRequest
Element: HelloRequest in http://www.bisoft.tl/ns
OutputMessage:
Part 1:
Name : HelloReponse
Element : HelloRequest in http://www.bisoft.tl/ns
调用请求:
<foo:HelloRequest xmlns:foo="http://www.bisoft.tl/ns">
<msg>Hello World!</msg>
</foo:HelloRequest >
返回响应:
<foo:HelloReponsexmlns:foo="http://www.bisoft.tl/ns">
<code>1</code>
</foo:HelloReponse>
这种文档风格的元素必须是定义良好的Well Defined。
两种风格的区别在于前者不能做Schema校验,而后者可以。因此后者渐渐成了主流。
PortType : 端口类型, WS没有直接包含所有操作,而是将操作分组成不同的端口类型。一个端口类型相当于Java中的类,而操作相当于一个静态方法。端口类型必须是唯一的,因些它也有完全限定名QName。
Binding : 绑定, 实际上一个端口类型支持不同的消息格式,如SOAP格式或文本格式。消息有多种方式传输Transported,如HTTP POST请求, SMTP邮件等。每种不同的组合起来叫绑定。
Binding
-----------------------
Name:binding1
PortType:stringutil
Format:SOAP
Transport:HTTP
Name:binding2
PortType:stringutil
Format:TEXT
Transport:SMTP
目前SOAP+HTTP比较常用。
SOAP : 简单对象访问协议。
Transported : 运送,传输。
PORT : 端口,绑定指定的PC端口及端点信息。可将WS部署到多台机器上,也可以部署到同一台机器的不同端口上。部署在同一台机器上的语言实现可以不同。如Java, C#。绑定方式也可以不同,如SOAP+HTTP, TEXT+HTTP。
TargetNameSpace : 目标命名空间。你也可能使用URN(Unique Resource Name)作为你的操作的命名空间。命名空间必须是一个URI,如URL,URN。
URN格式:
urn:object-type:object-id
示例:
urn:bisoft-tl:007
WSDL : WebService描述语言。包括SCHEMA, OPERATION, BINDING, PORT四大部分。
小结 :
WebService 跨平台,且语言无关。
一个WS包含一个或多个端口, 一个绑定部署指定消息格式与传输类型的端口类型到指定端点(网络地址)的端口上。一个端口类型包含一个或多个操作。一个操作包含两个消息。一个消息包含一个或多个参数。一个参数属于一个特定的Schema 基本类型或自定义类型。每个端口, 绑定, 端口类型, 操作都必须用 QName 来进行唯一性标识。
使用URN来唯一标识的话必须到 IANA(因特网编号管理局) 注册,防止对象类型冲突。