iOS 学习 RESTful 中 Http 的幂等性
一. RESTful
RESTful (Representational State Transfer) 是一种常用流行的软件架构,设计风格或协议标准。提供了一组设计风格和约束条件。主要用于客户端和服务端的交互。
1. 统一资源接口
2.使用http方法
iOS 以AFNetworking 为例
typedef NS_ENUM(NSUInteger, HTTPMethod) { GET = 10, HEAD, POST, PUT, PATCH, DELETE };
2.1 幂等性(idempotent、idempotence)
Methods can also have the property of “idempotence” in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is
the same as for a single request.
——HTTP/1.1规范中幂等性的定义
(1)幂等性是数学中的一个概念,表达的是N次变换与1次变换的结果相同
(2)“发起一个指定请求 N 次,得到的结果影响应该是一致的”
(3)http 幂等性 针对的是请求结果 不是请求资源内容
GET 幂等性:不论请求多少次,GET请求结果都不变。
(相当于只读,你只有读结果 eg: get news list / get current time stamp 可能返回内容有变坏,但是得到结果 就是目标新闻列表/当前时间戳 )
POST 非幂等性: 不论调用多少次,都将是产生新的资源 (相当于新建)
PATCH 非幂等性:PUT方法的补充,用来对已知资源进行局部更新,更新多次,就会请求多次 比如只执行一次累加,但是不小心触发多次求,累加结果会不断变化 (按需更新)
PUT 幂等性:操作主要用来替换全部的资源,而且其实幂等的。(用替换的形式来实现更新效果,每次都得把全部内容都写一遍,所有有了补充的PATCH)
DELETE 幂等性:请求删除目标资源,结果都是一个结果“删除”,因此是幂等的
2.2 遵守RESTful 设计规则 选择 Http 请求方式
(1)POST & PUT & PATCH 使用区别
如果是昨天之前,有人这么问我,我可能只会简单回答一两句:“POST 是向服务端写入资源,PUT 是更新全部资源,PATCH 是更新指定资源” 好像也说不出更多的花花样了。
那么现在我就会从幂等性和 RESTful 设计约束角度多说一点。
“POST 从幂等性质来讲 是非幂等的,使用POST 请求会明确可知这一点,每一次POST请求结果都会创建新的资源(关键在创建新的 非幂等)”
“PUT 是幂等的 是全部替换更新资源。(关键是在更新全部 幂等)”
“PATCH 非幂等性 是更新部分资源”
“看似有些时候 用哪种请求都尚可的情况,从尊重RESTful 协议角度,如果你明确这个api 需要资源幂等性,那么就应该设计使用PUT 的请求方式,这样来直观明确表达。”
(2)GET & POST 使用区别
如果是昨天之前,有人这么问我,我可能也是一两句回答:“GET 请求是没有请求body 直接url 明文获取资源 ,并且 url 长度还有限制 POST 请求是向服务端写入资源 有请求body POST 请求相对比 GET 更安全 因为body信息不在url里体现”。这样子
今天 我就可以从幂等性来进一步说明这个区别
“ GET 是幂等 适合做查询操作 POST 非幂等,适合做创建新增操作”
“如果都可以的时候,因为GET 请求参数都要写在URL 里 有明文 和 长度限制的特点”
“这个时候可以选择使用POST 来进行’查新’的折中方案,不会在url 中体现参数,也规避了url 的长度限制 虽然POST 非幂等,但方案折中符合要求 ”。
参考
- https://blog.csdn.net/SasukeN/article/details/80919889
- https://www.cnblogs.com/duhuo/p/4245202.html
- https://blog.csdn.net/qq_33489669/article/details/56479485
posted on 2019-01-07 18:40 ACM_Someone like you 阅读(665) 评论(0) 编辑 收藏 举报