文章目录
概念
Web Service是基于网络的、分布式的模块化组件,通过 Web 进行发布、查找和使用**。**是应用程序组件使用开放协议进行通信, 是独立的(self-contained)并可自我描述, 可通过使用UDDI来发现,可被其他应用程序使用。
其实WebService就是一种跨编程语言和跨操作系统平台的远程调用技术(RPC的一种实现方式)。
交互过程
Web Services 都是放在Web服务器(如IIS)的。
WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用,并注册到UDDI服务器,以便被人查找。
客户根据 WSDL 描述文档,使用XML封装一个 SOAP 请求消息,嵌入在一个HTTP POST请求中,发送到 Web 服务器来。
Web 服务器再把这些请求转发给 Web Services 请求处理器。
由请求处理器解析收到的 SOAP 请求,调用 Web Services,然后再生成相应的 SOAP 应答。
Web 服务器得到 SOAP 应答后,会再通过 HTTP应答的方式把信息送回到客户端。
Web services 三种基本元素:
- SOAP (简易对象访问协议)
- UDDI (通用描述、发现及整合)
- UDDI 是一种由 WSDL 描述的网络服务接口目录,通过它,企业可注册并搜索 Web services。
- UDDI是统一描述、发现和集成(Universal Description, Discovery, and Integration)的缩写。
- 它是一个基于 XML 的跨平台的描述规范,可以使世界范围内的企业在互联网上发布自己所提供的服务。
- UDDI 指通用的描述、发现以及整合(Universal Description, Discovery and Integration)。
- UDDI 是一种用于存储有关 web services 的信息的目录。
- UDDI 经由 SOAP 进行通迅。
- UDDI 被构建于 Microsoft .NET 平台之中。
- WSDL (Web services 描述语言)
SEI和CXF
SEI:WebService EndPoint Interface(终端,WebService的终端接口),就是WebService服务器端用来处理请求的接口;我们可以理解为是xxxWebService的各个xxxWebServiceImpl实现类
CXF:Celtix + XFire,一个apache的用于开发webservice服务器端和客户端的框架
WSDL
https://blog.csdn.net/wenzhi20102321/article/details/68486526
https://www.cnblogs.com/antLaddie/p/14968268.html
概念
WSDL (Web services 描述语言)
- 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。
- WSDL 指网络服务描述语言
- WSDL 使用 XML 编写
- WSDL 是一种 XML 文档
- WSDL 用于描述网络服务
- WSDL 也可用于定位网络服务
- WSDL 还不是 W3C 标准
WSDL文档结构
⼀个WSDL⽂档通常包含8个重要的元素,即definitions、types、import、message、portType、operation、binding、service元素。
元素 | 定义 | |
---|---|---|
<portType> | web service 执行的操作 | 相当于一个controller,描述了一个个 web service接口信息,如接口是否有输入输出、使用哪个message作为输入输出、接口的描述信息等 |
<message> | web service 使用的消息 | 定义接口的输入输出参数,由一个或者多个 part (参数)组成。 |
<types> | web service 使用的数据类型 | 定义数据类型,它使用某种类型系统(如 XSD) |
<binding> | web service 使用的通信协议、消息传递样式、编码样式 | 定义portType的消息格式和协议细节。<binding type="glossaryTerms" name="b1"> type绑定一个portType,name为自定义名称,定义每个接口的soap;定义为绑定和网络地址组合的单个端点。 |
definitions | 封装整个WSDL文档 | |
import | 导入其他WSDL文档,location为文档wsdl地址,namespace为指向的wsdl的命名空间 | |
service和port | service包含可多个port,每个port表示一个web服务,port将url赋给某个binding,多个port可以将不同url指向同个binding |
<portType>
portType使用operation
描述一个个的操作(接口)。
Operation(操作)
WSDL定义了四种操作:
1.单向(one-way):仅服务端接收请求/消息;
2.请求-响应(request-response):服务端接收请求/消息,并响应相关消息;
3.要求-响应(solicit-response):服务端发送请求/消息,并等待接收一个响应;
4.通知(notification):仅服务端发送请求/消息。
示例1:接受一个newTermVa
lues类型的输入参数,没有输出
<message name="newTermValues">
<part name="term" type="xs:string"/>
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="setTerm">
<input name="newTerm" message="newTermValues"/>
</operation>
</portType >
示例2:接受一个getTermRequest类型的输入参数,输出一个getTermResponse类型参数
<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>
还有两种操作类型:
Solicit-response 此操作可发送一个请求,并会等待一个响应。
Notification 此操作可发送一条消息,但不会等待响应。
<binding>
将⼀个抽象portType映射到⼀组具体协议(SOAO和HTTP)、消息传递样式、编码样式
binding 元素
两个属性:
- name 属性(定义 binding 的名称)
- type 属性(指向绑定的portType端口)
soap:binding 元素
两个属性:
- style 属性可取值 “rpc” 或 “document”
- transport 属性定义了要使用的 SOAP 协议。在这个例子中我们使用 HTTP。
operation 元素
定义了每个接口的 SOAP 行为、输入和输出编码等,在这个例子中我们使用了 "literal"编码
<binding type="glossaryTerms" name="b1">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
<operation>
<soap:operation soapAction="http://example.com/getTerm" />
<input>
<soap:body use="literal" />
</input>
<output>
<soap:body use="literal" />
</output>
</operation>
</binding>
<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>
WSDL1.2语法示例
<!-- 定义wsdl名称、命名空间等,1、xmlns:xxx:引用,相当于Java里面的import;2、name:SEI定义名称;3、targetNamespace:命名空间,相当于Java里面的package -->
<wsdl:definitions name="nmtoken"? targetNamespace="uri">
<!-- 导入其他WSDL文档,location为文档wsdl地址,namespace为指向的wsdl的命名空间 -->
<import namespace="uri" location="uri"/> *
<!-- documentation用于声明注释 -->
<wsdl:documentation .... /> ?
<!-- 定义数据类型 -->
<wsdl:types> ?
<wsdl:documentation .... /> ?
<xs:schema>
<!--定义一个复杂类型,但此类型为空(就是说countAllStudent方法为空参数)-->
<xs:complexType name="countAllStudent">
<xs:sequence/>
</xs:complexType>
</xs:schema>
</wsdl:types>
<!-- 定义接口参数 -->
<wsdl:message name="ncname"> *
<wsdl:documentation .... /> ?
<!-- element:引用指定的类型,类型在types中定义 -->
<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>
<!-- 将⼀个抽象portType映射到⼀组具体协议(SOAO和HTTP)、消息传递样式、编码样式,1、name:实现类名称;2、type:指定一个portType -->
<wsdl:binding name="ncname" type="qname">
<!-- 绑定什么类型的数据用来请求响应,style:绑定的数据是一个document(就是xml格式类型的请求响应) -->
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<wsdl:documentation .... /> ?
<-- binding details --> *
<!-- 用来指定SEI中的处理请求的方法,一般分为请求和响应,name:SEI实现类里的具体实现方法 -->
<wsdl:operation name="ncname"> *
<wsdl:documentation .... /> ?
<-- binding details --> *
<!-- 指定客户端请求和服务端响应过来的数据类型,use:定义类型literal(文本) -->
<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>
<!-- 定义binding的部署信息 -->
<wsdl:service name="ncname" serviceType="qname"> *
<wsdl:documentation .... /> ?
<!-- 每个port指定一个SEI的实现类,绑定一个binding,表示一个Web服务,binding:引用具体的<binding/>标签,name:具体的实现类对象 -->
<wsdl:port name="ncname" binding="qname"> *
<wsdl:documentation .... /> ?
<-- address details -->
<!-- 用来说明当前WebService的请求地址 -->
<soap:address location="xxx"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
图解
SOAP
概述
SOAP (简易对象访问协议)
- SOAP 指简易对象访问协议
- SOAP 是一种通信协议
- SOAP 用于应用程序之间的通信
- SOAP 是一种用于发送消息的格式
- SOAP 被设计用来通过因特网进行通信
- SOAP 独立于平台
- SOAP 独立于语言
- SOAP 基于 XML
- SOAP 很简单并可扩展
- SOAP 允许您绕过防火墙
- SOAP 将作为 W3C 标准来发展
结构
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
- 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
- 可选的 Header 元素,包含头部信息
- 必需的 Body 元素,包含所有的调用和响应信息
- 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
<?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>
语法规则
- 必须用 XML 来编码
- 必须使用 SOAP Envelope 命名空间http://www.w3.org/2001/12/soap-envelope
- 必须使用 SOAP Encoding 命名空间http://www.w3.org/2001/12/soap-encoding
- 不能包含 DTD 引用
- 不能包含 XML 处理指令
soap:encodingStyle
soap:encodingStyle用于定义在文档中使用的数据类型。此属性可用在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。
<soap:Header>
如果使用 Header 元素,则它必须是 Envelope 元素的第一个子元素。
<soap:Body>
Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。
<soap:Fault>
Fault 元素用于指示错误消息,使用时必须是 Body 元素的子元素。
在一条 SOAP 消息中,Fault 元素只能出现一次。
Fault 元素的子元素:
子元素 | 描述 |
---|---|
<faultcode> | 供识别故障的代码 |
<faultstring> | 可供人阅读的有关故障的说明 |
<faultactor> | 有关是谁引发故障的信息 |
<detail> | 存留涉及 Body 元素的应用程序专用错误信息 |
SOAP Fault 代码
在下面定义的 faultcode 值必须用于描述错误时的 faultcode 元素中:
错误 | 描述 |
---|---|
VersionMismatch | SOAP Envelope 元素的无效命名空间被发现 |
MustUnderstand | Header 元素的一个直接子元素(带有设置为 “1” 的 mustUnderstand 属性)无法被理解。 |
Client | 消息被不正确地构成,或包含了不正确的信息。 |
Server | 服务器有问题,因此无法处理进行下去。 |