一. 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 非幂等,但方案折中符合要求 ”。

      参考 

  1. https://blog.csdn.net/SasukeN/article/details/80919889
  2. https://www.cnblogs.com/duhuo/p/4245202.html
  3. https://blog.csdn.net/qq_33489669/article/details/56479485

iOS 学习 RESTful 中 Http 的幂等性的更多相关文章

  1. iOS学习——tableview中带编辑功能的cell键盘弹出遮挡和收起问题解决

    最近在项目中经常用到UITableView中的cell中带有UITextField或UITextView的情况,然后在这种场景下,当我们点击屏幕较下方的cell进行编辑时,这时候键盘弹出来会出现遮挡待 ...

  2. iOS学习——iOS原生实现二维码扫描

    最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...

  3. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  4. iOS学习——(转)iOS中关于通知的使用

    在移动端开打过程中,经常会用到通知和推送,例如有短信来了需要通知提示,手机横屏了需要通知提示,插上耳机了需要通知提示等等,我们可以根据这些通知采取对应的动作.iOS系统自身定义了很对通知,但是在开发过 ...

  5. iOS学习之UITableView中Cell的操作

    接着iOS学习之Table View的简单使用 这篇,这里主要讲UITableView 中的Cell的操作,包括标记.移动.删除.插入. 为了简单快捷,直接从原来那篇的代码开始,代码下载地址:http ...

  6. iOS 学习资料Blog 技术论坛等,不断添加中。。。。

    iOS 学习资料整理 http://www.jianshu.com/p/dc81698a873c    中文 iOS/Mac 开发博客列表  https://github.com/tangqiaobo ...

  7. iOS学习资料整理

    视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS S ...

  8. iOS 学习

    iOS 学习资料 (适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解 ...

  9. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

随机推荐

  1. iOS开发之-- textview 光标起始位置偏移

    使用textview的时候,会发生光标偏移的情况,其实是因为iOS7里导航栏,状态栏等有个边缘延伸的效果在. 把边缘延伸关掉就好了.代码如下 //取消iOS7的边缘延伸效果(例如导航栏,状态栏等等) ...

  2. 解决error: Unable to find vcvarsall.bat【python 2.7/vs2010】

    转自:http://blog.csdn.net/secretx/article/details/17472107 去下载安装VS2010(08版貌似也行,不过没必要用旧版,指不定哪个库又无法编译),给 ...

  3. SmartGit Mac、Liunx、Windows过期后破解方法

    根据自己的操作系统,进入相应的文件夹 ,可能还有一个版本号的文件夹,再进入 Windows: %APPDATA%\syntevo\SmartGit\ OS X: ~/Library/Preferenc ...

  4. Intent讲解

    什么是Intent? Intent是一个消息传递对象,可以使用它来启动其它应用组件.Intent使组件之间通信更加便利,主要用于以下三点: 启动Activity: 可以将intent作为参数调用Con ...

  5. php 实现Iterator 接口

    <?php class MyIterator implements Iterator{ private $var = array(); public function __construct($ ...

  6. 教你在Ubuntu上体验Mac风格

    导读 老实说,我是个狂热的 Ubuntu 迷,我喜欢 Ubuntu 默认的 Unity 主题样式外观.此外,还有很多关于 Ubuntu 14.04 的漂亮图标主题样式 可用来美化默认的外观.但正如我上 ...

  7. php做图片上传功能

    今天来做一个图片上传功能的插件,首先做一个html文件:text.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  8. 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流

    [BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...

  9. 【IIS】模块 DLL C:\Windows\System32\inetsrv\authcert.dll 未能加载。返回的数据为错误信息。

    解决方案,check  IIS --Client Certificate Mapping Authentication installed?

  10. IT资料常用网址汇总

    菜鸟联盟: http://www.runoob.com/ w3c school :https://www.w3cschool.cn/ http://www.w3school.com.cn/w3c/in ...