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

        

      参考 

  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 的幂等性

上一篇:Java代码启动Appium server


下一篇:Android-Java-synchronized静态方法&字节码文件对象