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
iOS 学习 RESTful 中 Http 的幂等性的更多相关文章
- iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决
最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的cell进行编辑时,这时候键盘弹出来会出现遮挡待 ...
- iOS学习——iOS原生实现二维码扫描
最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...
- iOS学习——(转)iOS中关于通知的使用
在移动端开打过程中,经常会用到通知和推送,例如有短信来了需要通知提示,手机横屏了需要通知提示,插上耳机了需要通知提示等等,我们可以根据这些通知采取对应的动作.iOS系统自身定义了很对通知,但是在开发过 ...
- iOS学习之UITableView中Cell的操作
接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...
- iOS 学习资料Blog 技术论坛等,不断添加中。。。。
iOS 学习资料整理 http://www.jianshu.com/p/dc81698a873c 中文 iOS/Mac 开发博客列表 https://github.com/tangqiaobo ...
- iOS学习资料整理
视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...
- iOS 学习
iOS 学习资料 (适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解 ...
- iOS 学习资料汇总
(适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...
随机推荐
- TArray<uint8>转FString
void ARamaUDPReceiver::Recv(const FArrayReaderPtr& ArrayReaderPtr, const FIPv4Endpoint& EndP ...
- AVR 定时器快速PWM模式使用
PWM很常用,AVR自带内部PWM功能,分为快速PWM模式和相位修正PWM模式. 我们这里选择方式15 ,由OCR1A保存上限值,由OCR1B保存匹配值,所以输出管脚 OCR1A不能输PWM,只能 ...
- 如何使用 awk 复合表达式
导读 一直以来在查对条件是否匹配时,我们使用的都是简单的表达式.那如果你想用超过一个表达式来查对特定的条件呢?本文中,我们将看看如何在过滤文本和字符串时,结合多个表达式,即复合表达式,用以查对条件. ...
- ios 一个正则表达式测试(只可输入中文、字母和数字)
一个正则表达式测试(只可输入中文.字母和数字) 在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到.之前在用java时特别是对用户名或密码使用正则非常爽,写 脚本上 ...
- 面试之一:CMS收集器整理
CMS收集器整理 @white 基本说明: 目标:获取最短回收停顿时间 算法:标记-清除算法 线程:并发 步骤: 初始标记:(会STP) 标记 GC Roots 能直接关联到的对象,速度很快 并发 ...
- ios开发 更改状态栏
设置statusBar 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UIStatusBarS ...
- Oracle Java Mission Control MBean 服务器 飞行记录器
Oracle Java Mission ControlMBean 服务器飞行记录器
- linux 将同后缀名的文件统一移至另一个文件夹
w
- 购物车删除商品,总价变化 innerHTML = ''并没有删除节点,内容仍存在
w元素的上的下. function deleteLi(tmpId) { //document.getElementById(tmpId).innerHTML = ''; var wdel = docu ...
- CF#301 C:Ice Cave(简单BFS)
C:Ice Cave 有一个m*n的地图,里面包含'.'表示完整的冰块,'X'表示有裂痕的冰块,当游戏者到达完整的冰块时,这个位置的冰块会变成有裂痕的冰块,如果到达有裂痕的冰块时,游戏者会进入下一关 ...