ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Restful Rails从1.2版本就开始实现RESTful了。 ### 什么是REST(Representational State Transfer) 及 RESTFul REST(Representational State Transfer)软件架构,是由Roy Thomas Fielding博士在2000年首次提出的。直到2005年,随着Ajax、Rails等Web开发技术的兴起,在Web开发技术社区掀起了一场重归Web架构设计本源的运动,REST架构风格得到了越来越多的关注。在2007年1月,支持REST开发的Ruby on Rails 1.2版正式发布,并且将支持REST开发作为Rails未来发展中的优先内容。Ruby on Rails的创始人DHH做了一个名为“World of Resources”的精彩演讲,DHH在Web开发技术社区中的强大影响力,使得REST一下子处在Web开发技术舞台的聚光灯之下。 直到今天,几乎看不到不支持REST开发的Web开发框架了。 所以,要想掌握Rails,REST是必须要理解的概念,除非你回去用Rails1.2之前的版本。 REST软件架构遵循了CRUD原则,该原则告诉我们对于资源(包括网络资源)只需要四种行为:创建(Create)、获取(Read)、更新(Update)和销毁(DELETE)就可以完成对其操作和处理了。 REST的特点有五个: - 资源(Resource) - 资源的表述(Representation) - 状态转移(State Transfer) - 统一接口(Uniform Interface) - 超文本驱动(Hypertext Driven) 分别代表: 1. 资源: 是服务器的一种抽象,服务器是由很多离散资源所组成。资源以名词为核心来组织,一个资源可由一个或多个URI来标识,URI既是资源的名称,也是资源的地址。资源可以是系统上的文件、可以是数据库中的表等具体的东西,也可以说其他抽象的东西,只要开发者自己能理解。 1. 资源的表述: 资源的表述是一段对于资源在某个特定时刻的状态的描述。可以在客户端-服务器端之间转移(交换)。资源的表述可以有多种格式,例如HTML/XML/JSON/纯文本/图片/视频/音频等等。资源的表述格式可以通过协商机制来确定。请求-响应方向的表述通常使用不同的格式。 1. 状态转移:是指在客户端和服务端之间通过转移代表资源状态的表述(json/html/xml等),来实现操作资源的目的。 1. 统一接口:REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。以HTTP/1.1协议为例,HTTP/1.1协议定义了一个操作资源的统一接口,主要包括以下内容: 7个HTTP方法:GET/POST/PUT/DELETE/PATCH/HEAD/OPTIONS 1. 超文本驱动: 资源之间通过超链接相互关联,超链接既代表资源之间的关系,也代表可执行的状态迁移。 ### 与REST架构风格并行的其他架构风格 - 分布式对象(Distributed Objects,简称DO) 架构实例有CORBA/RMI/EJB/DCOM/.NET Remoting等等 - 远程过程调用(Remote Procedure Call,简称RPC) 架构实例有SOAP/XML-RPC/Hessian/Flash AMF/DWR等等 ### Rails中的REST实现 - Rails中的每个Controller被看作一个资源 - 资源的CRUD,Rails默认支持使用HTTP的GET/POST/PUT/DELETE - 路由系统和URL Helper 方法生成基于RESTful的超链接 Rails中定义资源, config/routes.rb文件中: ~~~ resources :photos ~~~ Rails中action和http 方法的对应表: | HTTP Verb | Path | action | used for | |-----|-----|-----|-----| | GET | /photos | index | 显示所有的photos资源 | | GET | /photos/new | new | 返回一个创建新photo的页面 | | POST | /photos | create | 创建一个新的photo资源 | | GET | /photos/:id | show | 显示一个指定的photo资源 | | GET | /photos/:id/edit | edit | 返回一个编辑指定photo资源的html页面 | | PATCH/PUT | /photos/:id | update | 更新一个指定的photo资源 | | DELETE | /photos/:id | destroy | 删除一个指定的photo资源 | 注: PATCH只有Rails4支持。 上面的表中,我们可以看到Rails的action对应的HTTP方法,是符合RESTful的。 再看看Rails提供的URL Helper方法: - photos_path 生成的path: /photos - new_photo_path 生成的path: /photos/new - edit_photo_path(:id) 生成的path: /photos/:id/edit (例如, edit_photo_path(10) 生成的path: /photos/10/edit) - photo_path(:id) 生成的path: /photos/:id (例如, photo_path(10) 生成的path: /photos/10) ### 小结: RESTful架构,我自己的理解,用一句话简单的描述: 用HTTP本身提供的方法来响应服务器资源,并来修改其状态,就是RESTful的。 比如 GET [http://www.xxx.com/photos](http://www.xxx.com/photos) 就是要获取photos的所有资源。 非RESTFul的方式是这样的,拿RPC风格来举例: GET或POST请求, [http://www.xxx.com/get_photos](http://www.xxx.com/get_photos) 而这个get_photos是你自己定义的,别人也可以定义为get_all_photos,一点都不统一。并且忽略了HTTP方法本身的意义。 所以,RESTful,叫重归Web架构设计本源。 对于这个概念,也要求大脑里先有这个概念,后面我们再慢慢深入。 那么REST架构和MVC架构是否冲突? 我觉得不冲突, MVC是来描述系统内部的代码组织与数据流向,而REST架构,是一种Web Service接口规范。一个是内部,一个是外部。 了解Restful架构,对于我们理解Chef Server Api至关重要。