Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6643142
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Java

2011-06-08 22:34:30

本文主要介绍Rest风格的Web Services
author: ZJ 2007-10-23
 
1.什么是REST?
REST 是由 Roy Fielding 在他的论文中提出的一个术语。
REST 是英文 Representational State Transfer 的缩写,有中文翻译为具象状态传输(参考:SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。
可以将REST归纳如下:
 
1.1首先REST只是一种风格,不是一种标准
You will not see the W3C putting out a REST specification. You will not see IBM or Microsoft or Sun selling a REST developer's toolkit. Why? Because REST is just an architectural style. You can't bottle up that style. You can only understand it, and design your Web services in that style.
- Roger L. Costello
 
1.2  REST是以资源为中心的
REST中,认为Web是由一系列的抽象资源(Abstract Resource)组成,这些抽象的资源具有不同的具体表现形式((Representational State)。譬如,定义一个资源为photo,含义是照片,它的表现形式可以是一个图片,也可以是一个.xml的文件,其中包含一些描述该照片的元素。或是一个html文件。并且这些具体的表现可以分布在不同的物理位置上。
 
1.3  REST的目的是决定如何使一个定义良好的 Web程序向前推进
一个程序可以通过选择一个Web页面上的超链(这些链接代表资源),使得另一个Web页面 (Representational State of an abstract resource) 返回(transfer)到用户,使程序进一步运行。
 
1.4  REST充分利用或者说极端依赖HTTP协议
它通过逻辑URI定位资源
REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源。
这里必须注意
1,一个URI对应一个资源。
2,这里的URI是一个逻辑URI
一个逻辑 URI [url][/url]
一个物理 URI [url].html[/url]
 
通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
我们来看一个实际例子:
[url][/url] 指向 example.com 网站(可以视为一个 Web 应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 html 文档,其中用 来显示实际的照片。
[url][/url]这个地址很可能会在服务器内部处理为 [url][/url] 这样的地址。photo.jsp 是服务器端的一个动态脚本文件,根据 name 参数生成 html 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取同一个资源的不同表现形式的数据。对于这个要求,我们可以很容易的用另一个 URL地址达到:[url][/url]
但是,这就违背了URI 唯一标识一个资源的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI
而在REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 [url][/url]
那这是怎么办到的呢?是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如写了一个程序,现在只需要构造一个包含 Accept: text/xml HTTP 请求头,然后将请求发送到[url][/url] 就可以了。返回的结果就是一个 XML 文档,而不是别的资源形式的数据。
 
REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEADPUTDELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
Ø POST: 创建
Ø GET: 读取
Ø PUT: 更新
Ø DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
[url][/url](读取)
仍然保持为 [GET] [url][/url]
[url]/create[/url](创建)
改为 [POST] [url][/url]
[url]/update[/url](更新)
改为 [PUT] [url][/url]
[url]/delete[/url](删除)
改为 [DELETE] [url][/url]
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并对资源提供语义一致的操作服务。这对于以资源为中心的 Web 应用来说非常重要。
 
2RESTful Web Services 特点
通过将HTTP Accept类型设置为text/xml,我们便可以将资源返回的“具象状态”表示为可跨平台识别的数据。这是应用于Web Services的基础。
RESTful Web Service具有以下特点:
2.1无状态的
每一个来自客户端的request必须包含所有必要的信息,即不能从服务器端获得任何保存的上下文信息。
REST 客户机-无状态-服务器约束禁止在服务器上保存会话状态。符合这一约束进行设计
1,可以提高系统的可靠性和可伸缩性。它不需要昂贵的维护和支持费用,因为状态并不在服务器上维护。
2,可以进行资源缓存。Web的高速缓存既可以驻留在客户主机中,也可以驻留在中间网络高速缓存服务器主机中。
 
2.2  HTTP头中可见的统一接口和资源地址
通过对于HTTP Head 的解析,我们便可以了解到当前所请求的资源和请求的方式。相对于SOAP RPC风格来说,我们必须解析HTTP体。
这样做对于一些代理服务器的设置,将带来很高的处理效率。
REST 系统中所有的动作和要访问的资源都可以从H TTPURI 中得到,这使得代理服务器、缓存服务器和网关很好地协调工作。而RPC 型的SOAP 要访问的资源仅从 URI无法得知,要调用的方法也无法从 HTTP中得知,它们都隐藏在 SOAP 消息中。
同样的,在REST系统中的代理服务器还可以通过 HTTP 的动作 (GET POST)来进行控制。
 
2.3  返回一般的XML格式内容
一般情况下,一个RESTful Web Service将比一个SOAP RPC Web Service占用更少的传输带宽。
POST/Order HTTP/1.1
Host:[url][/url]
Content-Type:text/xml
Content-Length:nnnn
 
      098
      999
      89
      3000
 
POST/Order HTTP/1.1
Host:[url][/url]
Content-Type:text/xml
Content-Length:nnnn
SOAPAction:”urn:northwindtraders.com:PO#UpdatePO”
 
xmlns:xsi=”[url][/url]”
xmlns:SOAP-ENV=”[url][/url]”
xsi:schemaLocation=”[url]http:///schema/NPOSchema.xsd[/url]”>
   
      098
      999
      89
      3000
   
 
2.4  安全机制
REST使用了简单有效的安全模型。REST中很容易隐藏某个资源,只需不发布它的U RI;而在资源上也很容易使用一些安全策略,比如可以在每个 URI 针对 4个通用接口设置权限;再者,以资源为中心的 Web服务是防火墙友好的,因为 GET 意思就是GET P UT 的意思就是PUT,管理员可以通过堵塞非GET请求把资源设置为只读的,而现在的基于RPC 模型的 SOAP 一律工作在 HTTP POST上。
使用 SOAP RPC模型,要访问的对象名称藏在方法的参数中,因此需要创建新的安全模型。
 
2.5  无法用于事务型的服务
对于事务型的服务,一个简单的例子就是银行事务,在那里用户可以把钱从一个账户转移到另一个账户上。用户不想直接操作资源(钱、银行账户等等),他们只想告诉银行他们想要达到的目的,并且让银行根据他们的利益对资源进行处理。
所以从这一条,我们应该明白,选择基于RESTSOAP RPC风格的Web 服务,我们应该首先考虑这个服务是针对资源的还是针对活动的。
- James Snell面向资源与面向活动的 Web 服务,英文原文
 
3JAX-WS
Java Architecture for XML Web Services的缩写,简单说就是一种用JavaXML开发Web Services应用程序的框架目前版本是2.0, 它是JAX-RPC 1.1的后续版本。
JAX-WS2.0JAXB2来处理Java ObjectXML之间的映射。
JAX-WS通过javax.xml.ws.Provider接口来构建REST风格的终端。
 
4WADL
是由SUN公司提出的,旨在提供一种Web 应用的描述语言。WADL主要描述一个Web 应用的
  • 资源列表-站点所有的资源
  • 资源之间的关系-说明资源之间的链接关系
  • 所有应用于每个资源的特定方法-应用于每个资源的HTTP方法,指定的输入和输出以及它们支持的数据格式
  • 资源表现的形式-支持的MIME类型和所用到的XML schemas
 
下面是一个WADL示例,它描述了Yahoo新闻搜索的应用。
  • Lines 2 开始一个应用描述,定义所使用的namespaces
  • Lines 3–6 定义XML 语法,这个示例中是两个W3C XML Schema
  • Lines 7–11描述了Yahoo新闻搜索Web 资源以及它所支持的HTTP方法。
  • Lines 12–26 描述了‘search’ GET方法
  • Lines 13–21 描述输入
  • Lines 22–25 描述所有可能的输出。
 
5.关于WADL的项目介绍
wadl2java
A tool that generates client side stubs from WADL files. May be used from the command line or as an Apache Ant plug-in, see the wadl2java documentation for full details.
wadl2java_yahoo
A sample project that uses the wadl2java tool to create stubs for the Yahoo News Search Service. Includes a simple main method that uses the generated stubs to query for the latest Java news.
 
6.建议阅读的资料
[1]Roy Thomas Fielding
[2]
[3]
[5]
[8]WADL语言作者Marc Hadley's Blog
[9]

本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/47283

0人
了这篇文章
类别:分布式系统┆( 1)┆阅读( 7966)┆评论( document.write(replies) 9) ┆ 推送到技术圈返回首页
文章评论
 
[1楼]      [匿名]51CTO游客
2007-10-23 22:39:11
学习JAVA
很多不错的东西

[2楼]      [匿名]51CTO游客
2007-11-21 16:18:09


      顶. 博主.不错.写的很详细.
      希望能跟你有跟多的技术上的交流

[3楼]      [匿名]51CTO游客
2007-11-22 16:55:32
你的文章真是越来越牛了,不过,针对题目“构建REST风格的WebService ”,还是应该再多学些。

[4楼]      [匿名]gembin
2008-09-11 13:53:21
JAX-RS怎么不写

[5楼]      blackanger
2008-10-29 03:41:29
怎么不继续研究了, Java里有个restlet框架,就是方便构建rest式架构的。
博主回复: 2008-11-01 16:01:38
最近忙~不过还是要继续研究这个,我的毕设就写它

[6楼]      [匿名]51CTO游客
2009-07-02 15:09:45
dfdfd

[7楼]      [匿名]51CTO游客
2009-07-02 15:10:20
还没时入主题就没有。。。。。。

[8楼]      [匿名]其3412
2010-06-17 14:21:07
乱抄,结果都是错的的

[9楼]      [匿名]Zhangse
2010-06-17 14:21:48
严重BS LZ
博主回复: 2010-06-17 22:26:22
哈哈~轮不到你鄙视我,要鄙视我的人多了,排队去~

 
发表评论
昵  称: 登录  快速注册 验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容:
阅读(831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~