REST来源
REST:是一组架构约束条件和原则,REST是Roy Thomas Fielding在他2000年的博士论文中提出的。
Roy Thomas Fielding是HTTP协议(1.0版和1.1版)的主要设计者、Apache服务器作者之一、Apache基金会第一任主席
什么是REST
REST(Representational State Transfer):表现层状态转移,一种软件架构风格,不是标准。
既然不是标准,我可以遵守,也可以不遵守!!!
什么是表现层状态转移:
Representational (表现层)
State Transfer(状态转移):通过HTTP动词实现。
REST总结:URL定位资源,HTTP动词(GET,POST,PUT,DELETE)描述操作。
REST 用来规范应用如何在 HTTP 层与 API 提供方进行数据交互 。REST 描述了 HTTP 层里客户端和服务器端的数据交互规则;客户端通过向服务器端发送 HTTP(s)请求,接收服务器的响应,完成一次 HTTP 交互。这个交互过程中,REST 架构约定两个重要方面就是 HTTP 请求所采用的方法,以及请求的链接。
在请求层面,REST 规范可以简单粗暴抽象成以下两个规则:请求 API 的 URL 表示用来定位资源。
请求的 METHOD 表示对这个资源进行的操作。
REST并不是一种具体的技术,也不是一种具体的规范,REST其实是一种内涵非常丰富的架构风格。作为一个web开发者,对于HTTP协议一定非常了解,而REST是HTTP/1.1协议等Web规范的设计指导原则,HTTP/1.1协议正是为实现REST风格的架构而设计的。新的Web规范,其设计必须符合REST的要求,否则整个Web的体系架构会因为引入严重矛盾而崩溃。
理解REST,就需要理解REST的五个关键词:资源(Resource)、资源的表述(Representation)、状态转移(State Transfer)、统一接口(Uniform Interface)、超文本驱动(Hypertext Driven)。
三、什么是RESTful
基于REST构建的API就是Restful风格。遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用。
目前互联网公司的应用架构基本都是前后端分离,后端的接口也基本上都是采用restful架构。
四、为什么使用RESTful
1.JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码。这样会严重限制我们的开发效率,也不能让我们的java工程师专注于业务功能的开发,所以目前越来越多的互联网公司开始实行前后端分离。
2.近年随着移动互联网的发展,各种类型的Client层出不穷,RESTful可以通过一套统一的接口为Web,iOS和Android提供服务。另外对于广大平台来说,比如微博开放平台,微信开放平台等,它们不需要有显式的前端,只需要一套提供服务的接口,RESTful无疑是最好的选择。RESTful架构如下:
五、如何设计Restful风格的API
1.路径设计
—>在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表名对应,一般来说,数据库中的表都是同种记录的”集合”(collection),所以API中的名词也应该使用复数。
—>举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
2.HTTP动词设计
对于资源的具体操作类型,由HTTP动词表示,常用的HTTP动词如下:
请求方式 | 含义 |
---|---|
GET | 获取资源(一项或多项) |
POST | 新建资源 |
PUT | 更新资源(客户端提供改变后的完整资源) |
DELETE | 删除资源 |
如何通过路径和http动词获悉要调用的功能:
请求方式 | 含义 |
---|---|
GET /zoos | 列出所有动物园 |
POST /zoos | 新建一个动物园 |
GET /zoos/ID | 获取某个指定动物园的信息 |
PUT /zoos/ID | 更新某个指定动物园的信息(提供该动物园的全部信息) |
DELETE /zoos/ID | 删除某个动物园 |
GET /zoos/ID/animals | 列出某个指定动物园的所有动物 |
DELETE /zoos/ID/animals/ID | 删除某个指定动物园的指定动物 |