构建REST风格的Web Service

简介: 本文主要介绍Rest风格的Web Services。 author: ZJ 2007-10-23 Blog: [url]http://zhangjunhd.blog.51cto.com/[/url]   1.什么是REST? REST 是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。
本文主要介绍Rest风格的Web Services
author: ZJ 2007-10-23
 
1.什么是REST?
REST 是由 Roy Fielding 在他的论文Architectural Styles and the Design of Network-based Software Architectures中提出的一个术语。
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.
 
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]http://www.example.com/photo/logo[/url]
一个物理 URI [url]http://www.example.com/photo/logo.html[/url]
 
通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
我们来看一个实际例子:
[url]http://www.example.com/photo/logo[/url] 指向 example.com 网站(可以视为一个 Web 应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 html 文档,其中用 来显示实际的照片。
[url]http://www.example.com/photo/logo[/url]这个地址很可能会在服务器内部处理为 [url]http://www.example.com/photo.jsp?name=logo[/url] 这样的地址。photo.jsp 是服务器端的一个动态脚本文件,根据 name 参数生成 html 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取同一个资源的不同表现形式的数据。对于这个要求,我们可以很容易的用另一个 URL地址达到:[url]http://www.example.com/xml/logo[/url]
但是,这就违背了URI 唯一标识一个资源的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI
而在REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 [url]http://www.example.com/photo/logo[/url]
那这是怎么办到的呢?是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如写了一个程序,现在只需要构造一个包含 Accept: text/xml HTTP 请求头,然后将请求发送到[url]http://www.example.com/photo/logo[/url] 就可以了。返回的结果就是一个 XML 文档,而不是别的资源形式的数据。
 
REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEADPUTDELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
Ø POST: 创建
Ø GET: 读取
Ø PUT: 更新
Ø DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
[url]http://www.example.com/photo/logo[/url](读取)
仍然保持为 [GET] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/create[/url](创建)
改为 [POST] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/update[/url](更新)
改为 [PUT] [url]http://www.example.com/photo/logo[/url]
[url]http://www.example.com/photo/logo/delete[/url](删除)
改为 [DELETE] [url]http://www.example.com/photo/logo[/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]www.northwindtraders.com[/url]
Content-Type:text/xml
Content-Length:nnnn
 
      098
      999
      89
      3000
 
POST/Order HTTP/1.1
Host:[url]www.northwindtraders.com[/url]
Content-Type:text/xml
Content-Length:nnnn
SOAPAction:”urn:northwindtraders.com:PO#UpdatePO”
 
xmlns:xsi=”[url]http://www.3w.org/1999/XMLSchema/instance[/url]”
xmlns:SOAP-ENV=”[url]http://schemas.xmlsoap.org/soap/envelope[/url]”
xsi:schemaLocation=”[url]http://www.northwindtraders.com/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.0 JAXB2来处理Java ObjectXML之间的映射。
JAX-WS通过javax.xml.ws.Provider接口来构建REST风格的终端。
 
4WADL
Web Application Description Language (WADL) 是由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.建议阅读的资料
[2] RESTwiki
[8]WADL语言作者Marc Hadley's Blog

本文出自 “子 孑” 博客,请务必保留此出处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级,无需填写验证码

内  容:
目录
相关文章
|
27天前
|
前端开发 JavaScript 开发者
JavaScript:构建动态Web的核心力量
JavaScript:构建动态Web的核心力量
|
5月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
4月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
7月前
|
数据可视化 图形学 UED
从模型托管到交互开发:DataV 如何简化三维 Web 应用构建?
从模型托管到交互开发:DataV 如何简化三维 Web 应用构建?
189 2
|
8月前
|
安全 Linux 开发工具
零基础构建开源项目OpenIM桌面应用和pc web- Electron篇
OpenIM 为开发者提供开源即时通讯 SDK,作为 Twilio、Sendbird 等云服务的替代方案。借助 OpenIM,开发者可以构建安全可靠的即时通讯应用,如 WeChat、Zoom、Slack 等。 本仓库基于开源版 OpenIM SDK 开发,提供了一款基于 Electron 的即时通讯应用。您可以使用此应用程序作为 OpenIM SDK 的参考实现。本项目同时引用了 @openim/electron-client-sdk 和 @openim/wasm-client-sdk,分别为 Electron 版本和 Web 版本的 SDK,可以同时构建 PC Web 程序和桌面应用(Wi
518 2
|
10月前
|
安全 应用服务中间件 网络安全
实战经验分享:利用免费SSL证书构建安全可靠的Web应用
本文分享了利用免费SSL证书构建安全Web应用的实战经验,涵盖选择合适的证书颁发机构、申请与获取证书、配置Web服务器、优化安全性及实际案例。帮助开发者提升应用安全性,增强用户信任。
|
11月前
|
监控 前端开发 JavaScript
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
使用 MERN 堆栈构建可扩展 Web 应用程序的最佳实践
206 6
|
缓存 应用服务中间件 数据库
Python Web Service开发及优化
随着互联网的快速发展,Web服务已成为现代技术的核心。Python作为一种功能强大且易于学习的编程语言,在Web服务开发领域占据着重要地位。Python Web服务开发的重要性在于它能够提供高效、可扩展且易于维护的解决方案。本篇博客将探讨如何使用Python的Flask框架、Gunicorn WSGI服务器和Nginx网页服务器来实现高性能的Web服务。
|
XML Java 应用服务中间件
WebService - Axis2基于JAX-WS开发WebService并发布多个WebService
WebService - Axis2基于JAX-WS开发WebService并发布多个WebService
208 0
|
Java 应用服务中间件 Spring
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
WebService - Axis2使用services.xml进行开发server与client(未与Spring整合)
333 0