REST 是由 Roy Fielding 在他的论文《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”(参考:《SIP/IMS网络中的Representational State Transfer (REST)和数据分布》)。
—————————————
前面的内容比较枯燥,我说说我自己的理解。
但是 REST 到底是什么呢?论文我看不懂,不过找到一篇更简单易懂的东西:《Building Web Services the REST Way》。
根据这篇文章,我整理了一下我自己对 REST 的理解:
REST 首先只是一种架构样式,不是一种标准。这点和 Ajax 类似,两者都是利用现有的成熟技术。
在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现(或者说暴露)一个资源。
URI 是英文 Uniform Resource Identifier 的缩写,中文翻译“通用资源标志符”。
“通用资源标志符”是指唯一标识一个资源(xhtml 文件、图片、css 样式表)的字符串。当然了,RFC 中定义的 URI 复杂得多,不过我们此处将 URI 想象成一个人的身份证号码就行了(你不能有两个同时有效的身份证号码,一个号码也不可能同时对应两个人)。而我们天天挂在嘴边的 URL 地址就是 URI 的一种表现形式(个人理解,有错请纠正)。
知道什么是 URI 后,我们来看一个实际例子:
http://www.example.com/photo/logo 指向 example.com 网站(可以视为一个 Web 应用)中类型为 photo,名字为 logo 的资源。我们用浏览器访问这个 URI,看到的将可能是一个 xhtml 文档,其中用 来显示实际的照片。
http://www.example.com/photo/logo 很容易让你想到 URL 重写。事实上,这个地址很可能会在服务器内部处理为 http://www.example.com/photo.php?name=logo 这样的地址。photo.php 是服务器端的一个动态脚本文件,根据 name 参数生成 xhtml 文档返回给浏览器。
现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取“同一个资源的不同表现形式的数据”。对于这个要求,我们可以很容易的用另一个 URL 地址达到:http://www.example.com/xml/logo。
但是,这就违背了“URI 唯一标识一个资源”的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI。
而在 REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 http://www.example.com/photo/logo。
那这是怎么办到的呢?Ruby On Rails 中是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。
当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。
看到这里,聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数,那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。
如果考虑为 Web 应用增加 Web Services,这种技术的价值就体现出来了。比如我写了一个 Delphi 程序,现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头,然后将请求发送到 http://www.example.com/photo/logo 就可以了。返回的结果就是一个 XML 文档,而不是 xhtml 文档。
因为我们的 HTTP 请求头信息有不同的状态,从而可以获得不同的数据,所以叫做“具象状态传输”
—————————————
除了上面的用法,REST 还有进一步的扩展。
我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:
- POST: 创建
- GET: 读取
- PUT: 更新
- DELETE: 删除
经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:
http://www.example.com/photo/logo(读取)
仍然保持为 [GET] http://www.example.com/photo/logo
http://www.example.com/photo/logo/create(创建)
改为 [POST] http://www.example.com/photo/logo
http://www.example.com/photo/logo/update(更新)
改为 [PUT] http://www.example.com/photo/logo
http://www.example.com/photo/logo/delete(删除)
改为 [DELETE] http://www.example.com/photo/logo
从而进一步规范了资源标识的使用。
通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。
—————————————
Ruby On Rails 1.2 版对 REST 有很好的支持,但要在 PHP 中应用 REST 还需要解决不少问题:
- 如何在服务端判断 PUT、DELETE 请求方法;
- 如何获取用 PUT、DELETE 请求方法中传递的数据;
- 如何获取 HTTP 请求头信息中的 Accept 参数值;
- 如何在浏览器端发起 PUT 和 DELETE 请求。
不过我仔细看了 PHP 文档,我觉得上面几个问题都是可以解决的。
服务端综合使用 $_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 这些变量应该可以搞定前面三个问题。而第四个问题则可以用 JavaScript 的 XMLHttpRequest 对象来实现。
不过我想 REST 的真正价值在于 Web Services,而不是通过浏览器操作的应用程序。
分享到:
相关推荐
总结,学习REST服务意味着理解REST原则并掌握如何在Spring框架中应用这些原则。`RestTemplate`作为Spring提供的实用工具,大大简化了与REST服务的交互。通过深入阅读相关的博客文章,如“SpringSource Team Blog”,...
综合这三份文档,我们可以系统地学习REST的基本理论,了解RESTful设计的最佳实践,并掌握将其应用于实际项目中的技巧。这些知识对于任何需要构建Web服务或者API的开发者来说都是至关重要的,无论是新手还是经验丰富...
首先,“REST实战中文版”指的是这本书,通过“深入浅出”的叙述方式,这本书为读者提供了大量翔实的内容,是学习REST架构风格的宝贵资源。REST(Representational State Transfer)是一种软件架构风格,它定义了一...
本书《REST实战》深入浅出地介绍了REST的基本原理和实践技巧,是学习REST模式设计的重要参考资料。 在Java中实现REST服务,通常会用到JAX-RS(Java API for RESTful Web Services)规范,该规范为构建RESTful服务...
- [《学习 REST 教程》](https://www.example.com/learn-rest-tutorial) ##### 3.2 基础知识 在 PowerBuilder 12.5 .NET 中调用 RESTful 服务前,需要了解以下几个概念: 1. **HTTP 方法**:RESTful 服务通常使用...
总的来说,通过Django学习REST API是一个很好的实践,因为它提供了完整的工具链,让你能够快速高效地构建健壮的API。在实践中,你将不断探索DRF的更多功能,如自定义序列化、视图行为、错误处理等,从而提升你的Web...
学习REST风格的Web服务,不仅可以提升你的Web开发技能,还能让你更好地理解和构建现代分布式系统,是每一个IT从业者不可或缺的知识点。通过实践和研究这个案例,你可以深入理解RESTful设计原则,并将这些知识应用到...
我将在个人博客上配合详细文字说明对二进制分析的思路进行介绍,如果你同时学习rest_framework,替换本项目下载到你的Python安装文件下的\ Lib \ site-packages \目录下,然后根据博客上的说明,配合pycharm设置断点...
这对于调试API、测试服务端功能或学习REST API的设计模式极其有用。 在使用这款插件时,用户可以自定义请求头,添加必要的参数,包括查询参数、请求体数据、JSON对象等。它支持多种内容类型,如application/json、...
扫描版(atcpu.com).pdf"是本书的扫描版,读者可以通过此PDF文件阅读到完整的内容,学习REST的相关知识。 3. "灯火互联网法律声明.txt"和"灯火互联网.txt"可能是网站的法律条款和网站介绍,提醒用户在使用服务时需...
本进阶学习资料将带你深入理解Django REST的高级特性,帮助你从初级用户晋升为熟练开发者。 首先,了解REST(Representational State Transfer)的核心概念至关重要。REST是一种网络应用程序的设计风格和开发方式,...
5. 学习资源:对于初学者或开发者,这可能是一个学习REST API设计的实例。 【压缩包子文件的文件名称列表】"PAF_Practical_REST-源码.zip" 是源码的实际压缩文件,可能包含以下内容: 1. 项目结构:包括src/main...
**REST(表述性状态转移)**是Web服务架构设计中的一个核心概念,由美国计算机科学家Roy Thomas Fielding在他的...这份文档为深入学习REST提供了一个宝贵的资源,无论你是初学者还是经验丰富的开发者,都能从中受益。
这表明Fielding博士在互联网架构设计领域具有举足轻重的地位,他的理论和贡献对于理解和学习REST架构风格至关重要。 文档的内容涵盖了软件架构的基础知识,包括运行时抽象、架构元素(组件、连接器和数据)、配置、...
2. **RESTful API设计**:学习REST原则,包括资源的表述状态转移(Representational State Transfer),以及如何使用HTTP动词和URI来定义接口。 3. **Controller层**:创建Spring Boot的控制器类,使用`@...
在"spring mvc rest基础学习demo"中,我们将深入探讨如何使用Spring MVC构建RESTful API。 REST(Representational State Transfer,表现层状态转移)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,以...
【标题】"soap_to_rest_node:将SOAP转换为REST请求的项目"是一个旨在帮助开发者将传统的SOAP...同时,项目中的源代码和测试案例可以作为学习REST和SOAP转换的实例,对于提升开发者在API设计和实现方面的技能大有裨益。