沾益县住房和城乡建设局网站,公司网站开发维护,鄂州网上房地产,基于wordpress的用户管理实现原理1 什么是 RESTful
百度一下 RESTful#xff0c;查到的资料很多都讲得不清楚#xff0c;看完了都不知道说的是啥#xff0c;导致很多人对 RESTful 不甚了解。来看一下常见的解释#xff1a;
#xff08;1#xff09;神一样的描述 REST 并不是“休息”的意思#xff0c;…1 什么是 RESTful
百度一下 RESTful查到的资料很多都讲得不清楚看完了都不知道说的是啥导致很多人对 RESTful 不甚了解。来看一下常见的解释
1神一样的描述 REST 并不是“休息”的意思而是 Representational State Transfer 的简称即 表现层状态转移。
“表现层状态转移”是什么鬼
2云里雾里的描述
REST 指的是 一组架构约束条件和原则如果一个架构符合 REST 的约束条件和原则就称之为 RESTful 架构。RESTful 是一种软件架构风格而不是标准。
这能看懂一点了但还是云里雾里的。
3大神的总结 再看知乎大神 Ivony 的一句话精辟概括 用 URL 定位资源用 HTTP 动词GETPOSTDELETEPUT描述操作。 RESTful 是一种 web 服务设计风格风格意思就是大家默认的但不是强制的。
2 RESTful 详解
2.1 用 URL 定位资源
REST 的主体是资源所谓“资源”就是网络上的一个具体信息例如一张图片一段文字、一种服务。总之就是一个实际存在的东西而 URL 就是用来指向这个资源的。
例如
https://api.example.com/users这个 URL 一看就知道是对 user 资源的操作。URL 中只使用名词来指定资源不包含操作。为什么呢
如果要包含操作那至少有增删改查四种那么上例中的一个接口至少要变成四个
https://api.example.com/add_user
https://api.example.com/delete_user
https://api.example.com/update_use
https://api.example.com/get_user太多了不够简洁。
2.2 用 HTTP 动词描述操作
那怎么描述操作呢答案就是用 HTTP 动词。
HTTP 动词可能很多人第一眼看到的时候有点蒙不知道是啥其实就是我们请求网页时用的 GET、POST 等操作。我们平时用的最多的就是 GET 和 POST例如写爬虫的时候基本都是这两种常用的还有 PUT、PATCH、DELETE 。
对资源的操作无外乎 CRUD增删改查RESTful 中每个 HTTP 动词对应一个 CRUD 操作。
GET对应 Retrieve 操作查询操作POST对应 Create 操作DELETE对应 Delete 操作PUT对应 Update 操作PATCH对应 Update 操作
2.3 POST 和 PUT 的区别
一般说到 HTTP 动词对应 CRUD 的时候PUT 都是对应 Update 操作的。但其实PUT 也可以做 Create 操作。二者的区别在于
URLPOST 不需要指定到个体例如新增 user 的接口 POST /api/users。 PUT 的 URL 需要指定到具体的个体例如 PUT /api/users/1如果 1 这个 user 存在则 Update否则 Create。这个很好理解POST 确定是新增insert 的时候是不需要 where 条件的PUT 则不行update 的时候不加 where干过的小伙伴请举手。另外PUT 的时候也不是每个 user 就要建一个接口的这里需要用到的就是路由一般是写成 PUT /api/users/{id}这样就具有一般性了。路由在这里就不展开讲了。幂等性PUT 是幂等的而 POST 是非幂等的。关于幂等性见下文。
2.4 PATCH 和 PUT 的区别
PATCH 是 2010 后成为的正式 http 方法它是对 PUT 的补充。在没有 PATCH 之前都是用 PUT 进行更新操作这时候我们的接口中通常会有一个逻辑规则如如果对象的一个属性值为null那么就不更新该属性字段值通过这种方式来避免全部覆盖的操作。现在有了 PATCH 就解决了这种判断在 PUT 操作中不管属性是不是 null都进行更新在 PATCH 接口中就对非 null 的进行更新。另外PATCH 是非幂等的。
2.5 变通的 POST
按照 REST 建议查询操作要使用 GET 方法但是实际情况中处理起来比较麻烦如报表统计查询需要传递的参数很多如果采用 GET 方法那么接口接收的参数非常多接口很难看通常会封装为 java 对象但 GET 方法又不支持对象传参所以很蛋疼
对于这种情况最简单的方式就是改成 POST 方式而且很多公司都是这么干的。可见 REST 只是建议并非强制约束。
补充幂等性
幂等Idempotence本来是一个数学上的概念定义就不说了看了头晕。
后来拓展到计算机领域描述为 一个操作、方法或者服务其任意多次执行所产生的影响均与一次执行的影响相同。 一个幂等的方法使用同样的参数对它进行多次调用和一次调用对系统产生的影响是一样的。所以对于幂等的方法不用担心重复执行会对系统造成任何改变。
举个例子用户 X 的手机话费余额为 2 元他用支付宝给手机充了 100 元话费如果将这个操作描述为“给 X 的账户余额增加 100 元”那就是非幂等的重复操作几次运营商就亏大了。但是如果将这个操作描述为“将 X 的账户余额设置为 102 元”那这个操作就是幂等的。简单来说
幂等操作将账户 X 的余额设置为 102 元非幂等操作将账户 X 的余额增加 100 元。
注意这里的幂等性的例子并不严谨本文主要不是讲幂等性的所以只是举个简单的例子不做深入探讨。
3 RESTful 的其他细节
3.1 命名规则
1全部小写用 _ 或 - 线连接。
例如我在上面给出的例子
https://api.example.com/add_user之所以不用驼峰命名法是因为早期的 URI 一般都是表示服务器上的文件路径而不同服务器对大小写的敏感性是不同的为了兼容不同服务器所以才规定不能混用大小写字母。
2URL 中只用名词指定资源因为 REST 的核心是资源而表示资源的词语天然就是名词。3资源用复数表示。
3.2 版本
一种方法是在 URL 中添加版本号例如
https://api.example.com/v1/users另一种方法是将版本号加在 HTTP 请求头信息的 Accept 字段中例如
Accept: version1.0虽然有很多博客里推荐里说是推荐在 header 里添加版本信息因为不同的版本表示的资源依然是同一个所以不应该用不同的 URL。但是以我目前了解到的情况来看绝大多数公司都是将版本号放在 URL 中的并且推荐这么做简单直观。 网上能找到的版本号加在 URL 中的例子都是如我上例所示的写法。但是 Jack_Zeng 指出这样写容易有歧义会让人误以为 v1 也是资源的一部分一般都是这么写
https://api.example.com/users?api-version13.3 HTTP 状态码
知乎上另一大神对 RESTful 的解释相比于 Ivony 多了一句话他用了三句话来描述
看 Url 就知道要什么看 http method 就知道干什么看 http status code 就知道结果如何
前两句和 Ivony 的是一个意思。这第三句我觉得总结得也很经典。
http 状态码有 100 多种我们并不需要全部用到只需要了解其中常用的就可以了
200 – OK – 一切正常201 – OK – 新资源已经被创建204 – OK – 资源删除成功304 – 没有变化客户端可以使用缓存数据400 – Bad Request – 调用不合法确切的错误应该在 error payload 中描述401 – 未认证调用需要用户通过认证403 – 不允许的服务端正常解析和请求但是调用被回绝或者不被允许404 – 未找到指定的资源不存在422 – 不可指定的请求体 – 只有服务器不能处理实体时使用比如图像不能被格式化或者重要字段丢失500 – Internal Server Error – 标准服务端错误开发人员应该尽量避开这种错误
参考资料
https://www.zhihu.com/question/28557115https://blog.csdn.net/mingjia1987/article/details/79651241