XML与WebService期末复习——webservice
Posted 几何天下
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XML与WebService期末复习——webservice相关的知识,希望对你有一定的参考价值。
webservice相关知识整理
概论
定义: Web service是一个平台独立的,低耦合的,自包含的、可编程的、能通过web访问的(web-enable)应用程序,可使用开放的XML标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
即,一个能够使用XML消息通过网络来访问的服务, 这个服务通过Interface描述了一组可访问的操作。
服务的行为、输入/输出都可使用 WSDL 描述
适应松散耦合的网络环境,可通过Web访问,手段是 SOAP Message 。
目标: 在现有的各种异构平台的基础上,构筑一个通用的,与应用无关、语言无关的技术层 ,各种不同平台之上的应用依靠这个技术层来实施彼此的连接和集成。
Web Service则要解决如何让计算机系统来使用Web应用所提供的服务。
应用: 互联设备,整合应用
特点:
良好的封装性
使用者仅看到Web Service提供的功能列表松散耦合
只要接口不变,其使用方法就不会改变使用标准协议规范
使用开放的标准协议进行描述、传输和交换高度可互操作性
可以跨越平台、语言进行调用高度可集成能力
Web 服务体系结构中的角色
服务提供者: 从企业的角度看,这是服务的所有者。从体系结构的角度看,这是托管访问服务的平台。
服务请求者: 从企业的角度看,这是要求满足特定功能的企业。从体系结构的角度看,这是寻找并调用服务,或启动与服务交互的应用程序。
服务注册中心 : 这是可搜索的服务描述注册中心,服务提供者在此发布他们的服务描述。在静态绑定开发或动态绑定执行期间,服务请求者查找服务并获得服务的绑定信息(在服务描述中)。
服务请求者也可以从服务注册中心以外的其它来源得到服务描述。
Web 服务体系结构中的操作
发布: 为了使服务可访问,需要发布服务描述以使服务请求者可以查找它。
查找: 在查找操作中,服务请求者直接检索服务描述或在服务注册中心中查询所要求的服务类型。对于服务请求者,可能会在两个不同的生命周期阶段中牵涉到查找操作:
在设计时为了程序开发而检索服务的接口描述,
在运行时为了调用而检索服务的绑定和位置描述。
绑定: 最后需要调用服务。在绑定操作中,服务请求者使用服务描述中的绑定细节来定位、联系和调用服务,从而在运行时系统中调用或启动与服务的交互。
web服务过程
服务提供者将所提供的服务发布到服务代理的一个目录上
服务请求者首先到服务代理提供的目录上搜索 服务,得到如何调用该服务的信息
根据得到的信息调用服务提供者提供的服务
web service 协议栈
soap->wsdl->uddi->wsfl
SOAP
简介: SOAP是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。SOAP提供了一种基于 XML 且具有以下特性的消息处理框架。
特点(重点,简答):
自由的传输绑定 (不仅仅是HTTP)
自由的语言绑定 (比如Java, C#)
可插入的数据格式 (当然必须基于XML)
完全的中立 (中立、公开的标准)
独立于任何编程语言、对象模型、操作系统、平台、协议
优点
简单性,SOAP所基于的XML具有高度的结构化,并且很容易解析。
可移植性:SOAP无须依赖底层平台,不需要考虑诸如字节顺序或计算机字长这类问题。
与防火墙的兼容性:soap可以穿过防火墙。
使用开放标准:SOAP使用XML开放标准来格式化数据。
互操作性:SOAP是建立在开放技术之上的,从而有利于实现真正的分布式互操作性和松耦合性的应用。
被广泛接受
适应变化:soap基础架构的变化通常不会影响到该协议的应用。
缺点
SOAP最初仅限于HTTP,采用了并不适合所有情况的请求/应答体系结构。HTTP是一个相当慢的协议,从而影响了SOAP的性能
Soap是无状态的,然而在一些业务处理和事务中,多个webservice之间需要相互交互,这是就需要维护连接的状态。
SOAP基于值的串行化,而不支持基于引用的串行化。基于值的串行化允许对象的多个副本含有的状态不同步。这就意味着soap上不能以对象引用的形式引用一些外部数据源。
语法规则:
SOAP消息必须用XML来编码
SOAP消息必须使用SOAP Envelope命名空间
SOAP消息不能包含DTD引用
SOAP消息不能包含XML处理指令
该元素可以包含命名空间声明和额外的属性,如果声明额外的属性,必须使用命名空间修饰。
Envelope可以包含额外的子元素,但必须使用命名空间修饰并且跟在SOAP Body元素之后。
分布式消息传送
1、SOAP客户端应用程序创建一个SOAP消息XML文档进行请求。这个消息包含远程调用分布式系统中的方法所需的信息。包含请求的方法和参数。
2、网络基础设施将消息发送给消息提供者的soap服务器。
3、soap服务器将请求消息发送给服务提供者的Webservice实现代码。Soap服务器确保将所收到的文档从XML转换为特定的编程语言对象。SOAP消息中的编码模式将决定如何转换。
4、SOAP响应消息被转交给服务提供者的SOAP运行时系统,并以服务请求者的URI作为目的地。
5、soap服务器通过网络将soap响应消息转发给服务请求者。
6、在服务请求节点上的网络基础设施接收响应消息,并可以转换为应用程序能理解的对象。
消息交换模型
单向传送模型:该模型将 XML 消息从发送者传送到接收者。
请求/响应模型:接收方向发送方发送响应消息
增加可选的“SOAP中介(intermediary)”:用来在 SOAP 发送者和最终 SOAP 接收者之间截取 SOAP 消息。
SOAP消息结构
message->envelope->header/body->fault
<?XML version=“1.0”?><soap-env:Envelop xmlns: soap-env="http://schemas.xmlsoap.org/soap/envelope/"soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <soap-env:Header> <!– 报头定义 --> </soap-env:Header> <soap-env:body> <!– 消息定义 --> <soap-env:Fault> <!– 相关错误处理信息 --> </soap-env:Fault> </soap-env:body></soap-env:Envelope>
1、soap envelope
SOAP Envelope (信封)是SOAP消息结构的主要容器,也是SOAP消息的根元素。必须出现在每个SOAP消息中,用于把此XML文档标识为一条SOAP消息.在SOAP中,使用XML命名空间将SOAP标识符与应用程序的特定标识符区分开,将SOAP的消息的元素的作用域限制在一个特定的领域。
2、soap header
Header的目的就是对扩展的消息格式进行封装,且无需与有效载荷发生关联,也不需要修改soap的基本结构,因此soap消息可以通过header不断添加新的特性和功能,例如安全性、事务等。
可以在消息的头部存放扩展数据,从而使得服务中的每个方法调用无须将那个数据作为方法的参数。
Header元素允许在头部放置数量不限子元素,这些子元素称为头块,表示一个数据的逻辑分组。
每一个头块都有自己的命名空间。
soap中介
soap env:role属性
mustunderstand属性
actor属性
3、soapbody
SOAP Body(主体)元素作为子元素包含在SOAP信封中,且包含:
RPC方法及其参数
目标应用程序(消息接收者)专用数据
报告故障和状态信息的SOAP故障(FAULT)
在SOAP消息中,所有的Body元素必须是SOAP Envelope元素的直接子元素。
4、soap fault
SOAP Fault(错误)元素用于在SOAP消息中传输错误及状态信息。如果SOAP消息需要包括SOAP Fault元素,它必须作为一个Body项出现,而且至多出现一次。
Faultcode: 标识故障,包含用于标识该SOAP应用程序的故障或状态的标准值。这些Faultcode
值的命名空间标识符在http://schemas.xmlsoap.org/soap/envelope/ 中定义。
Faultstring: 提供SOAP故障的可读描述
Faultactor: 描述在消息路径中错误的引发者。类似于SOAP actor 属性,不过它记录的不是Header的接收者,而是指示错误源。
Detail: 该元素提供与已定义的Body块相关的,特定于应用程序的故障或状态信息。 Detail的所有直接子元素都称为detail项。
soap通信模型
Soap支持两类通信方式: RPC(远程过程调用 )类型和文档类型。
RPC类型的webservice
表现为客户端应用的一个远程对象。
客户端将请求表达成带有参数的方法调用,返回的响应将包含返回值。
文档类型(document)的webservice
消息驱动
可以使用soap来交换文档,这些文档可以包含任何类型的XML数据。
SOAP并不提供任何方式将源和目的地信息编码到信封当中。对于webservice而言,webservice基础设施决定将SOAP消息发送到哪里,如何发送。
在文档型SOAP应用中,对于SOAPbody元素的内容没有限制。
与RPC类型不同,文档类型不支持消息的自动串行化/逆串行化。
WSDL
概述
Web 服务描述语言(Web Services Description Language,WSDL)是用于描述Web服务的一种XML语言;是一种定义在Web上的对象,Web Service的开发者需要对服务的调用方式进行某种结构化的说明,以便服务的调用者能够正确的使用这些服务。
WSDL规范实际上分为两部分:服务接口定义和服务实现。
元素构成与作用
元素名称 | 元素的作用 |
---|---|
definitions | 根元素,定义名称,声明命名空间 |
types | 描述webservice与调用者之间使用的数据类型 |
message | 消息的逻辑定义 |
operation | 所支持的操作的抽象定义 |
porttype | 某个访问点所支持的所有操作的抽象的定义 |
binding | 特定porttype定义的操作和消息格式协议之间的绑定 |
port | webservice绑定地址 |
service | 相关服务访问的集合 |
use属性取值
为:encoded or literal
在“encoded”的情况下,抽象的定义通过应用SOAP编码规则转换成具体格式。
在“literal”的情况下,抽象类型定义本身成为具体定义(它们是“literal”定义)。在这种情况下,您可以简单地检查XML架构类型定义,以确定具体的消息格式。
WSDL的消息传输模式
单向操作
单向操作时服务端点接收消息的一种操作,但该操作并不发送一个响应。
例如,将一个订单提交给订购系统的操作可以是一个单向操作。在发送订单之后,并不期待会立即有一个响应。
单向消息仅定义一个输入消息,既不需要输出消息,也不需要出错消息。
请求响应操作
服务端接收一个消息,并返回一个响应。
通知操作
服务端口将消息发送给客户端,但不期待一个响应;
在portType元素中包含一个out标签,但没有input消息的定义。
要求响应操作
服务端发送一个消息并期待收到一个响应消息;
服务端点发起这个操作,而不是响应客户端的请求;
portType先声明一个output标签,然后声明一个input消息;
UDDI
UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
UDDI两个操作:Web Service的描述与注册
使用webservice过程
开发新应用
查询UDDI
定位Web服务、下载其描述
根据描述创建Java client proxy
在应用中编写调用Java client proxy methods 代码
测试应用
Java client proxy通过SOAP调用Web service methods
编写服务端实例
(1)创建一个Web工程
(2)引入CXF jar包 apache-cxf-2.7.17
把前面下载的CXF包解压,进入lib目录。把所有jar包拷贝到刚创建的Web工程的lib目录。
(3)开发一个Web Service业务接口。
该接口要用@WebService修饰
package com;import javax.jws.WebService;@WebService(targetNamespace="http://service.demo.ws/")public interface Login { String login(String name,String password);}
(3)开发一个Web Service实现类
实现类也需要用@WebService修饰
package com;import javax.jws.WebService; @WebService(endpointInterface = "com.Login", serviceName = "LoginService")public class LoginImpl implements Login { public String login(String name, String password) { String result = "登录CXF 服务端成功!"; if (!"cxf".equalsIgnoreCase(name) || !"cxf".equalsIgnoreCase(password)) { result = "用户名或密码不正确,请重新登录!"; } return result; } }
(5)使用EndPoint类的静态方法来发布WebService
import javax.xml.ws.Endpoint; public class webServiceApp { /** * @param args */ public static void main(String[] args) { System.out.println("web service start"); LoginImpl implementor = new LoginImpl(); String address = "http://localhost:8080/CXF/Login"; Endpoint.publish(address, implementor); System.out.println("web service started"); } }
注:可以编写一个Java类进行发布,也可以使用Servlet进行发布
本文在博客 几何军工作室 首发
https://kfzjw008.github.io
以上是关于XML与WebService期末复习——webservice的主要内容,如果未能解决你的问题,请参考以下文章