Fork me on GitHub

谈谈RESTful

network/restful/banner

看官国庆快乐@~@!节后来一篇小博文吧~在平常的开发中,前后端在接口协调这块耗费的时间比较多,本博文不说接口字段的定义协调,而是说说接口的RESTful。

REST(Representational State Transfer,表述性状态转移)指的是一组架构约束条件和原则。如果一个架构符合REST的约束条件和原则,我们称它为RESTful架构。

上面重复出现了约束条件和原则,那究竟是哪些呢?

约束条件和原则

资源和资源的表述

REST中的第一个字母表示的是表述性,它是对资源进行表述。资源是网络上的一个实体,一张图片,一端文本。资源总是要通过一个载体来反应它的内容,比如图片可以有png,jpg,gif等形式展示出来。

URI

每个URI(Uniform Resource Identifier,统一资源标识符)都对应一个特定的资源。一般的,一个资源至少对应一个URI和它对应,即是一对多的关系。URI包含URL和URN,目前WEB中比较流行的只有URL。

network/restful/uri

统一接口

数据的基本操作CRUD(Create,Read,Update,Delete)对应着数据库中的SQL语句的CREATE,SELECT,UPDATE,DELETE操作。这里的RESTful也就对应着POST,GET,PUT/PATCH,DELETE。这里的PUT/PATCH都有对资源更新的效果,但是两者又是有是有区别的:

PUT是对要更新的资源,比如某个学生的信息,是要全部更新的,而PATCH可以对资源进行局部的更新,还是刚才某个学生的信息,可以只是更新其联系电话,其他字段都没触碰到,节省了部分流量。

资源的链接

REST是使用标准的HTTP方法来操纵资源的,但仅仅因此就理解成带CURD的Web数据库架构就太过于简单了。

这种反模式忽略了一个核心的概念:“超媒体即应用状态引擎(hypermedia as the engine of application state)”。

嗯~超媒体是什么呢?

引用参考的资料粘贴一下:

当你浏览Web网页时,从一个连接跳到一个页面,再从另一个连接跳到另外一个页面,就是利用了超媒体的概念:把一个个把资源链接起来.

要达到这个目的,就要求在表述格式里边加入链接来引导客户端。在《RESTful Web Services》一书中,作者把这种具有链接的特性成为连通性。下面我们具体来看一些例子。

下面是使用postman展示的是github获取某个组织下的项目列表的请求,可以看到在响应头里边增加Link头告诉客户端怎么访问下一页和最后一页的记录。 而在响应体里边,用url来链接项目所有者和项目地址。

network/restful/resource_link_img1

network/restful/resource_link_img2

无状态

无状态即所有的资源都可以URI定位,而且这个定位和其他资源无关,也不会因为其他资源的变化而变化。

HTTP方法

GET

获取资源,对应上面说的SQL的SELECT语句

POST

传输实体主体,比如登陆某宝时候传输用户名和密码等。也用添加信息,对应上面说的SQL中的CREATE语句

POST主要是用来传输数据,而GET主要是用来获取数据。那么它们有什么区别呢?

嗯~大侠请看下面表格:

-GETPOST
历史记录参数被保留在浏览器历史记录中,因为参数是URL的一部分参数不能被保存在浏览器的历史记录中
书签可以收藏为书签不可以收藏为书签
回退按钮/重新提交行为如果HTML是存储在浏览器的缓存中,GET请求可以执行回退,但是不能重新提交内容到服务器浏览器通常会警告用户需要重新提交数据
编码类型(编码方式属性)application/x-www-form-urlencodedmultipart/form-data或者application/x-www-form-urlencoded
参数可以发送参数,但是数据仅限填入请求行(URL)。最安全的是使用少于2K的参数,一些服务器最多可以处理64K可以将参数(包括上载文件)发送到服务器。
破解更容易破解脚本更难破解脚本
数据类型的限制只允许ASCII字符没有限制,二进制的数据也是允许的
安全性GET比POST安全性低,因为数据是放在URL中发送。因此它以明文形式保存在历史记录和服务器日志中。POST比GET更加安全些,因为参数不存储在浏览器历史记录或者Web服务器日志中。
表单数据长度限制有限制,因为表单数据位于URL中,并且URL长度受到限制。安全的URL长度限制通常是2018个字符。但是也因不同浏览器和WEB服务器而异。没有限制
可用性GET方法不被使用在发送密码或者其他敏感信息的场景上POST方法是使用在发送密码或者其他敏感信息的场景上
可见性GET方法是对每个人可见,展示在浏览器的地址栏中,但是限制信息发送的大小POST方法在浏览器地址栏中不可见
缓存可以被缓存不能被缓存

上面表格的比较翻译自很早发表的文章GET vs. POST

PUT

上传文件,也用于修改资源,对应上面的说的SQL中的UPDATE语句

PATCH

对资源进行部分修改,对应SQL中的UPDATE语句

PUT 用于修改资源,但是只能完全替代原始资源,PATCH 允许部分修改。上面内容有提及,请前翻查看。

DELETE

删除文件,对应SQL中的DELETE语句

获取报文首部

该方法和GET方法类似,但是不返回报文实体主体部分(可以理解为返回为空)。主要用来确认URL的有效性以及资源更新的日期时间等。

OPTIONS

查询支持的方法。

查询指定URL能够支持的方法。这里我还是以github的组织api为例子,截图如下:

network/restful/options_demo

嗯~其他的方法暂时不做介绍了

状态码

状态码比较多啊,这里挑一些重要的来说下,参考阮一峰大佬的~~

1XX信息

1XX信息感觉作用不大。

  • 100 Continue: 表示到目前为止都很正常,客户端可以继续发送请求获取忽略这个响应。

2XX

  • 200 OK [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。

  • 201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。

  • 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)

  • 204 NO CONTENT - [DELETE]:用户删除数据成功。

3XX

  • 301 Moved Permanently :永久性重定向。这个永久性的重定向慎用啊,用了后控制权就不在你手上了。不确定资源是否要真的重定向,还是建议302这个。

  • 302 Found :临时性重定向

  • 303 See Other :和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源。

  • 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since,如果不满足条件,则服务器会返回 304 状态码。

  • 307 Temporary Redirect :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。

4XX

  • 400 Bad Request - [POST/PUT/PATCH]请求报文中存在语法错误。所以遇到这个检查下你传输给后端的数据格式是否正确吧。

  • 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。

  • 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。

  • 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。

5XX

  • 500 Internal Server Error :服务器正在执行请求时发生错误

  • 03 Service Unavailable :服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。

嗯,上面又说到了一个幂等,那什么是幂等呢?

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

参考

<-- 本文已结束  感谢您阅读 -->
客官,且步,赏一个呗 (@ ~ @)