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 ... 
随机推荐
- ConfigParser 读写配置文件
			一.ini: 1..ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式 2.ini文件创建方法: (1)先建立一个记事本文件.(2 ... 
- yii 常用orm
			yii2 orwhere andwhere的复杂写法:https://www.codercto.com/a/6513.html $files = XXXX::find() ->andWhere( ... 
- swift - SQLite数据库的使用(引用)
			SQLite轻量级数据库在移动应用中使用非常普遍,但是目前的库是C编写的,为了方便使用,对SQLite相关的操作用Swift进行了封装.这个封装代码使用了一个开源项目SQLiteDB,地址是:http ... 
- Python 使用正则表达式匹配IP信息
			使用正则表达式匹配IP地址 .MAC地址 .网卡名称: #!/usr/bin/env python #-*- coding:utf-8 -*- import re from subprocess im ... 
- 使用Audio API设计绚丽的HTML5音乐播放器
			HTML5 有两个很炫的元素,就是Audio和 Video,可以用他们在页面上创建音频播放器和视频播放器,制作一些效果很不错的应用. 无论是视屏还是音频,都是一个容器文件,包含了一些音频轨道,视频轨道 ... 
- UIScrollView小记
			视图的滚动过程,其实是在不断修改原点坐标.当手指触摸后,ScrollView会暂时拦截触摸事件,使用一个计时器.假如在计时器到点后没有发生手指移动事件,那么ScrollView发送tracking e ... 
- css做鼠标指向图片图片放大但边框不放大
			这是一个圆形边框做的效果 HTML <div class="circle-wrapper"> <img src="" > </di ... 
- 【黑金原创教程】 FPGA那些事儿 SignalTap II 调试技巧
			简介工具篇系列的第三本教程,讲述各种与SignalTap II 有关的调试技巧. 目录[黑金原创教程] FPGA那些事儿<工具篇III>:File01 - 上线调试与下线调试[黑金原创教程 ... 
- redis哨兵集群、docker入门
			redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ... 
- Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)
			工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ... 
