摘? 要:本文展示了Http协议的强大能力,如何定义什么是Restful Web Service架构以及以当今RPC式Web服务的对比,并解析了Restful Web Service架构的四个特征:可寻址性、无状态性、连通性和统一接口。
关键字:HTTP;URL;REST;Web服务
中图分类号:TP393.04????????????????????????? 文献标识码:A
Analysis of Restful Web Service Architecture
ZHAO Bo-wen
(School of Software Engineering, Tongji University,Shanghai? 201413)
Key words:HTTP;URL;REST;Web Service
1? Http协议基础
Http是一种基于文档的协议。客户端把文档放在Http信封里,然后发给服务器;服务器作为回应,把响应文档放到Http信封里,然后发回给客户端。
以下是一个Http请求:
GET? /index.html HTTP/1.1
Host: www.google.com
Accept: text/html
Accept-Charset: utf-8
Connection: keep-alive
Http请求信息包括以下几个部分:
HTTP方法:对于这个请求时“GET”方法。Http方法的名称,就如同编程语言的方法名称,表示客户端希望服务器如何处理这封信。
路径:是URI主机名后面的信息。对于这个请求,URI是,路径是www.google.com。路径就是信封的地址。
请求报头:是一组关键字-值对,起元数据的作用,例如向主机、接受字体等元数据信息。
实体主体或表示:就是信封里的文档。在这里GET信封里没有文档,是空的。
Http响应信息包括三个部分。Http响应代码,通知客户端的请求是成功还是失败;响应报头,跟请求报头一样,起元数据的作用;实体主体或表示,相当于信封里具体的信件文档。
2? Web服务架构的分类
Http是Web服务所共有的,而Web服务之间的差别,是因为它们在两个问题上的做法不同:
一、客户端是如何把自己的意图传达给服务器的,具体地说就是客户端如何告诉服务器应该做什么样的操作。例如是获取数据、删除数据还是改写数据呢?这种对数据采取什么操作的信息,称之为方法信息。
二、客户端如何告诉服务器对哪些数据进行操作,例如服务器已知道客户端请求删除数据,但要删除那些数据呢?这种信息称为作用域信息。
2.1传统的RPC Web服务架构
RPC(远程过程调用)式Web服务通常从客户端收到一个充满数据的信封,然后返回一个充满数据的信封。常见的信封格式是SOAP。RPC架构意味着方法信息和作用域信息都放在信封实体里。
例如一个描述XML-RPC请求的HTTP信封:
POST? /RPC? HTTP/1.1
HOST www.search.com ….
<?xml version=”1.0”?>
<method>
<methodName>search</methodName>
</method>
在上述的RPC Web服务调用中,无论你向服务器请求什么方法,URI永远是www.search.com,Http方法永远是POST。
2.2 Restful Web服务架构
Restful Web服务是符合REST(Representational State Transfer)风格的Web服务架构,按照Roy Fielding博士论文里的评判标准是符合Web特点的。
Restful Web服务架构意味着,方法信息都在HTTP方法里;作用域信息都在URI里。
方法信息放到HTTP方法里就是指通过GET、PUT、DELETE等标准的HTTP方法来区分获得数据、修改数据或删除数据。使web服务有统一的接口。不像RPC式的服务将方法信息放到实体里,无论客户端请求获得数据或删除数据都使用POST方法,不具有统一接口,使web服务之间的交互困难。
作用域信息放在URI里就是指无论要操作什么样的数据都通过URI获得,这样一个Restful Web Service的请求信息的第一行就能了解客户端要做什么了。
例如:GET? /Report/week? HTTP/1.1 就是要获得周报表数据。而RPC式则将作用域数据放到实体里,使得RPC式的客户端请求格式复杂同时也不具有可寻址性(后面会详细介绍)。
3 Restful Web服务架构的四个特征
这里我们将阐述Restful Web服务架构的四个特征:可寻址性、无状态性、连通性和统一接口。
3.1Restful Web服务架构的资源概念
任何事物,只要具有被引用的必要,它就是一个资源。在Web服务上它至少有一个URI(统一资源标识符),URI既是资源的名称,也是资源的地址。在Restful Web 服务架构中URI只能指示唯一一个资源,但是响应信息可以包括多个资源,例如包括一些其它资源的连接信息。
3.2可寻址性
可寻址性是指用户可以通过唯一标示的信息获得特定的资源。例如在windows浏览器中,你要察看哪个文件夹直接敲入地址,即可直接访问。例如:C:\Program Files\Windows NT就可直接访问Windows NT文件夹。在Web服务中可寻址性就是指每一则服务都是可直接访问的,可以被添加到收藏夹里。Web是可寻址的似乎是理所当然的,可是许多Web应用却不是可寻址的。例如Gmail在线Email服务,Gmail的URI始终是http://mail.google.com/。
无论用户是什么操作,是要获得信息还是要上传信息,用户都不会看到其它URI,例如“关于狮子的邮件”这个资源就不是可寻址的。
在Restful Web服务中如果一个应用把资源发布出来,那么该应用就是可寻址的。因为资源是通过URI暴露的,所以一个可寻址的应用应该会为它提供的每一则信息都发布一个URI,URI的数量在Restful web Service中是无限的。可寻址性的优点是可以让客户端灵活自如使用Web Service上资源,甚至超出Web服务设计者的想象。可寻址性本身就是Web上的一大优点,在Restful web Service中我们应当保留这个优点。
3.3无状态性
无状态性意味着每个Http请求都是完全孤立的。当客户端发一个Http请求,请求里应当包含服务器实现该请求的所有信息,不依赖于任何以前的信息。假设本次请求需要之前请求的信息,那就应当将该信息也放到本次请求里。
Restful Web Service应当遵循这样的原则,从可寻址性方面考虑无状态性。无状态性要求:服务器可能的状态也是资源,也应该有自己的URI。客户端不必为了某个资源的请求而让服务器提前进入某种状态。例如google搜索网站,打开http://www.google.com/后在输入框填入”apple”,然后点击Search.得到相应结果。用户同样可以直接输入http://www.google.com/search?hl=en&q=apple&aq=f 得到搜索结果而不用先打开google主页,这就是无状态性的一种体现。
3.4连通性
表示(Representation)就是序列化的数据结构,把其中的数据取出即可丢弃。但在Restful Web Service中,表示应该是超媒体(HyperMedia),也就是说表示中不仅包含数据,还包含指向其它资源的连接。这种具有“连接”的特性,称为连通性。
连通性使服务器通过超媒体告诉客户端当前状态有哪些后续状态可以进入。例如在http://www.google.com/search?hl=en&q=apple&aq=f资源里的“下一页”连接起的就是这种推进作用――它指引你如何从当前状态进入下一个可能的状态。在Restful Web服务的文档中只要包含URI就可以指向本应用的其他状态,因为Restful Web Service是可寻址且无状态的应用。
3.5统一接口
在Restful Web Service中,我们对资源的操作仅限制为HTTP提供的基本操作,这里列举常用的四种方法:
?获取资源的一个表示:Http GET。
?创建一个新资源:向一个新的URI发送HTTP PUT或向一个已有URI发送HTTP POST。
?修改已有资源:向已有的URI发送HTTP PUT。
?删除已有资源:HTTP DELETE。
REST要求使用统一的接口,即每个服务器都以同样的方式使用HTTP接口。这样要求的意义在于:不论你对Web上哪个资源作GET请求,都意味着读取。统一接口令服务之间的交互更加容易。
参考文献:
[1]Roy Thomas Fielding Architectural Styles and the Design of Network-based Software Architectures Computer Science 2000.
[2] Fielding R T. Principled Design of the Modern Web Architecture. Proc. of the 2000 Intl.Conf.on Software Engineering (ICSE 2000),? Limerick. Ireland. 2000- 06:407- 416.
[3]Leonard Richardson Restful Web Service[M] .电子工业出版社 ISBN 978-7-121-06227 2008-5.
详细解决方案
懂得Restful Web Service(一)
热度:164 发布时间:2012-09-12 09:21:30.0
相关解决方案
- 小弟我想做一个多功能web service client
- Servlet.service() for servlet [jsp] in context with path解决方案
- web service 第一天接触不懂 仍是那个访问天气预报的例子 代码很简单
- Web Service 错误:服务器未能识别 HTTP 头 SOAPAction 的值: http://tempuri.org/
- web service No services have been found.解决方法
- 学习Web Service,用哪种框架好?AXIS,XFire,CXF?该如何处理
- java service 项目有关问题
- 求大神指路 jsp maven spring restful,该怎么处理
- 对象集,数组,web service,该怎么解决
- org.apache.catalina.core.ApplicationDispatcher invoke Servlet.service() for se解决思路
- Restful(2)Spring整合CXF,发布RSETful 风格WebService
- RestFul(1)WebService之CXF的RestFul风格开发
- JMS:Java讯息服务(Java Message Service)初学笔记
- 新手学习j2me,请教调用.net service 时用ksoap,还是用JSR172好
- WCF service 下传订单文件到ftp
- 请教:有人开发过OPOS驱动吗,撰写 service object?
- vc写的 windows service 控制台程序有关问题
- 请教一上有没有C++调用WEB SERVICE 做成DLL的例子
- vs2008中怎么使用vc++构建web service
- 客户端用vc2005的c++来编写,web service 只是连接就报错解决方法
- Reporting service 中使用储存过程有关问题
- Reporting Service 报表订阅 到win2003 系统的有关问题
- Reporting Service 分组排列有关问题
- Silverlight学习数据跟RIA服务时,找不到domain service class模板
- 生手学习web service
- asp reporting service 只显示一起,大神进
- ajax怎么调用带有SoapHeader的 web service
- ASP.NET web service 中 怎么保持状态
- !AJAX的autocompleteextender控件实现自动输入一定需要Web Service
- 无法打开登录所请求的数据库 "xxx"登录失败用户 'NT AUTHORITY\NETWORK SERVICE' 登录失败解决方案