RESTful Web APIs设计风格
RESTful(Representational State Transfer,简称REST)是一种网络Web程序的设计风格和开发方式。
一、RESTful简介
在开发Web应用时,可以采用前后端不分离模式或前后端分离模式。
1. 前后端不分离模式
前后端不分离模式的代码耦合度比较高,前端页面看到的效果都是由后端控制的,这种Web应用一般是纯网页应用,基本不存在前后端之间的接口交互。
2. 前后端分离模式
前后端分离模式中,后端仅返回前端所需的数据,不渲染HTML页面,不控制前端的效果。前端和后端之间通过接口来传递数据,后端返回的数据通常采用json格式的数据,前端不管是网页(PC端)还是APP(移动端),都可以解析后端返回的数据,然后自己渲染页面效果。
后端开发的视图函数或视图类都被称为接口,或者API(Application Programming Interface,应用程序编程接口)。接口用来处理数据库中的数据,然后将处理后的数据返回给前端,一个接口通常只做一件事(查询、增加、修改、删除)。这样,前端通过访问对应的接口来对数据进行增删改查。
大部分Web应用采用的都是前后端分离模式,RESTful 接口设计方式是前后端分离的Web最常用的接口设计方式。
RESTful 接口设计方式定义了很多容易理解和方便实现的设计风格,通过接口文档,前端程序员和后端程序员可以顺畅沟通。通过接口文档,可以快速了解一个陌生项目的业务。
RESTful 接口设计方式不是一种必须遵守的语法或规则,只是采用这种方式,会享受到 RESTful 带来的种种便利,下面就开始详细了解 RESTful 。
二、RESTful 中HTTP请求方式的定义风格
所有的 Web 服务都使用 HTTP 来发送网络请求,只是使用的方式不同。
不同的 HTTP 请求方式对应对数据的不同操作,请求方式由 HTTP 动词来表示,如 GET,POST,PUT,DELETE。
在 RESTful 规范中,常用的 HTTP 动词有:
GET: 查询数据(一项或多项),对应数据库SELECT
POST: 新建数据,对应数据库CREATE
PUT: 修改数据(提供对象改变后的完整数据),对应数据库UPDATE
PATCH: 修改数据(只提供对象被修改的属性),对应数据库UPDATE
DELETE: 删除数据,对应数据库DELETE
HEAD: 获取对象的元数据
OPTIONS: 获取信息,资源的哪些属性是可以改变的
在对同一个数据库进行操作时,使用不同的请求方式对应的操作是不相同的,通过不同的 HTTP 请求方式,来区分对数据库的增删改查操作。
需要注意的是, PUT 和 PATCH 两种请求方式都是对数据进行修改操作, PUT 需要提供修改后的完整数据,PATCH 只需要提供修改了的属性数据就可以了。如,有一个 Computer 的数据库,Computer 有两个属性颜色 color 和发布日期 date ,修改某一条数据的 color 属性,使用 PUT 请求方式修改时,不仅需要发送修改后的 color ,还需要把 date 一起带上,而 PATCH 只发送 color 就可以了。
三、RESTful 中URI路径的定义风格
所有的 Web 服务都使用 URI ,只是使用的方式不同。
URI 是 Web 前端与后端进行数据交互的路径,是用户与 Web 服务器交互时传递信息的接口。
路径可以理解成网址,每个路径对应一个网址,每个网址对应一种资源,资源就是后台数据库中的数据对象。
在 RESTful 规范中,将资源名作为路径。资源对象是一个名词,所以路径中只能是名词(资源对象名),不能是动词,而且所用的名词往往与数据库的表名对应。
如数据库中有一个 Phone 的数据库,则对应的路径如下:
GET /phones 获取phones列表的信息
POST /phones 新增一个phone对象
GET /phones/7 获取phone7的信息
PUT /phones/7 修改phone7的信息
DELETE /phones/7 删除phone7的信息
对于同一个数据库的操作,一般都是使用这个数据库的名词来作为路径。而且,不管操作单条数据或多条数据,名词都是使用复数形式,如果是单条数据,则会跟一个 id 。
《RESTful Web APIs》中的示例:
四、RESTful 中返回状态码的定义风格
定义了 HTTP 请求方式和 URI 路径,向后端发送请求,后端会返回数据,这时候就会有返回状态码。
对于 HTTP 请求,返回的状态码,常见的如下:
1xx
:返回相关信息,服务器成功接收部分请求,要求继续提交其余请求才能完成整个处理过程。
2xx
:操作成功,服务器成功接收请求并已完成整个处理过程,常用200(OK 请求成功)。
3xx
:重定向,为完成请求,需进一步请求,常用302(所请求的页面已经临时转移至新的url)。
4xx
:客户端的请求有错误,常用404(服务器无法找到被请求的页面)。
5xx
:服务器端出现错误,常用500(请求未完成,服务器遇到不可预知的情况)。
在 RESTful 规范中,对应上面的请求方式,常见的返回状态码如下:
200 [GET]:服务器成功返回用户请求的数据
201 [POST/PUT/PATCH]:用户新建或修改数据成功
204 [DELETE]:用户删除数据成功
400 [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 [*]:表示用户没有权限(令牌、用户名、密码错误)
403 [*] 表示用户得到授权,但是访问是被禁止的
404 [*]:服务器无法找到被请求的页面
500 [*]:服务器发生错误,用户将无法判断发出的请求是否成功
在返回状态码中,不同请求方式成功后,返回的状态码不一样。
五、RESTful 的其他相关内容
RESTful Web APIs 设计风格的主要规范就是上面几点,此外,还有很多相关的规范,如:
1. 返回数据尽量使用 JSON 格式。
2. 当一个 URI 同时对多个数据库进行操作时,可以拼接在一起。
如同时操作 Computer 和 Phone 数据库,可以 /computers/{computer_id}/phones/{phone_id} 。
3. 通过查询字符串来体现过滤信息。
RESTful 是一种设计风格,在使用时可以只遵守适合自己项目的规范,灵活应用。
RESTful 是与编程语言分离的,使用任何一门语言来编写 Web API,都可以采用 RESTful 风格,如 JAVA,Python,PHP 等。
如果想了解更过关于 RESTful Web APIs 的内容,您可以登陆 RESTful Web APIs 的网站: http://www.restfulwebapis.org/ ,点击 RESTful Web APIs >> Download RESTful Web Services (PDF) 下载PDF版的书《RESTful Web APIs》来阅读。(下载的是英文版,主要关注 RESTful 包含哪些部分,对主要内容看一下,具体理解结合开发过程来理解)。