restful 幂等性(什么是幂次法则)

理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTfulAPI。怎么理解幂等性HTTP幂等方法,是指无论调用多少次都不会有不同结果的HTTP方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。还是以之前的博文的例子为例。【GET】/users#查询用户信息列表【GET】/users/1…

大家好,又见面了,我是你们的朋友全栈君。

理解RESTful的幂等性,并且设计符合幂等规范的高质量RESTful API。

怎么理解幂等性

HTTP幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。

还是以之前的博文的例子为例。如何设计良好的api

【GET】          /users                # 查询用户信息列表
【GET】          /users/1001           # 查看某个用户信息
【POST】         /users                # 新建用户信息
【PUT】          /users/1001           # 更新用户信息(全部字段)
【PATCH】        /users/1001           # 更新用户信息(部分字段)
【DELETE】       /users/1001           # 删除用户信息

HTTP GET方法

HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。

【GET】          /users                # 查询用户信息列表
【GET】          /users/1001           # 查看某个用户信息

只是查询数据,不会影响到资源的变化,因此我们认为它幂等。

值得注意,幂等性指的是作用于结果而非资源本身。怎么理解呢?例如,这个HTTP GET方法可能会每次得到不同的返回内容,但并不影响资源。

可能你会问有这种情况么?当然有咯。例如,我们有一个接口获取当前时间,我们就应该设计成

GET     /service_time # 获取服务器当前时间

它本身不会对资源本身产生影响,因此满足幂等性。

HTTP POST方法

HTTP POST方法是一个非幂等方法,因为调用多次,都将产生新的资源。

【POST】         /users                # 新建用户信息

因为它会对资源本身产生影响,每次调用都会有新的资源产生,因此不满足幂等性。

HTTP PUT方法

HTTP PUT方法是不是幂等的呢?我们来看下

【PUT】          /users/1001           # 更新用户信息(全部字段)

因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。

HTTP PATCH方法

HTTP PATCH方法是非幂等的。HTTP POST方法和HTTP PUT方法可能比较好理解,但是HTTP PATCH方法只是更新部分资源,怎么是非幂等的呢?

因为,PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的资源。换句话说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是非幂等的了。

可能你还不能理解这点。我们举个例子

【PATCH】        /users/1001           # 更新用户信息(部分字段)

此时,我们服务端对方法的处理是,当调用一次方法,更新部分字段,将这条user记录的操作记录加一,这次,每次调用的资源是不是变了呢,所以它是有可能是非幂等的操作。

HTTP DELETE方法

HTTP DELETE方法用于删除资源,会将资源删除。

【DELETE】       /users/1001           # 删除用户信息

调用一次和多次对资源产生影响是相同的,所以也满足幂等性。

如何设计符合幂等性的高质量RESTful API

HTTP GET方法 vs HTTP POST方法

也许,你会想起一个面试题。HTTP请求的GET与POST方式有什么区别?你可能会回答到:GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。但是,我们现在从RESTful的资源角度来看待问题,HTTP GET方法是幂等的,所以它适合作为查询操作,HTTP POST方法是非幂等的,所以用来表示新增操作。

但是,也有例外,我们有的时候可能需要把查询方法改造成HTTP POST方法。比如,超长(1k)的GET URL使用POST方法来替代,因为GET受到URL长度的限制。虽然,它不符合幂等性,但是它是一种折中的方案。

HTTP POST方法 vs HTTP PUT方法

对于HTTP POST方法和TTP PUT方法,我们一般的理解是POST表示创建资源,PUT表示更新资源。当然,这个是正确的理解。

但是,实际上,两个方法都用于创建资源,更为本质的差别是在幂等性。HTTP POST方法是非幂等,所以用来表示创建资源,HTTP PUT方法是幂等的,因此表示更新资源更加贴切。

HTTP PUT方法 vs HTTP PATCH方法

此时,你看会有另外一个问题。HTTP PUT方法和HTTP PATCH方法,都是用来表述更新资源,它们之间有什么区别呢?我们一般的理解是PUT表示更新全部资源,PATCH表示更新部分资源。首先,这个是我们遵守的第一准则。根据上面的描述,PATCH方法是非幂等的,因此我们在设计我们服务端的RESTful API的时候,也需要考虑。如果,我们想要明确的告诉调用者我们的资源是幂等的,我的设计更倾向于使用 HTTP PUT 方法。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127879.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [Z]word画图转成eps的方法

    [Z]word画图转成eps的方法

    2021年8月24日
    79
  • windows 多线程_关于多线程的技术分享

    windows 多线程_关于多线程的技术分享本文内容较为详细,关于更简短的一篇介绍,请看这里:https://blog.csdn.net/weixin_45525272/article/details/105057120多线程同步技术在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解。正常情况下对这种处理结果的了解应当在其处理任务完成后进…

    2022年8月18日
    7
  • 简单使用SAXReader解析xml数据

    简单使用SAXReader解析xml数据之前的工作中,一直是使用json格式的数据进行数据传输。很少会接触到xml格式的数据。不过因为工作需求,在对接其他产品的接口时,偶尔会遇到需要使用xml格式数据的情况,所以,也得学学如何解析xml。不过个人感觉,还是Json比较容易些啊,第一次解析xml时,我是一脸懵逼的,不过难者不会,会者不难,知道其中的原理和使用方法,其实发现xml也是很简单而且很强大的。简单的学习一下xml,在w3sch

    2022年7月12日
    43
  • 使用python进行方差分析_python多因素方差分析

    使用python进行方差分析_python多因素方差分析利用python实现方差分析简介 方差分析是一种常用的对数据进行分析的方法,用于两个及两个以上样本均数和方差差别的显著性检验。本文介绍单因素方差分析和双因素方差分析。 方差分析存在三个假设: 1、各样本总体服从正态分布。 2、各样本总体方差一样。 3、各样本总体相互独立。单因素方差分析 单因素方差分析就是在只有一种影响因素下判断各个样本间的均值差别的显著性。 数据会…

    2022年10月15日
    2
  • 仿微博php生成短网址

    htmlcodephpcode推荐:http://www.cnblogs.com/roucheng/p/3528396.html

    2021年12月27日
    41
  • idea中引用子项目文件夹(renren-generator)出现的问题[通俗易懂]

    idea中引用子项目文件夹(renren-generator)出现的问题[通俗易懂]在项目中引入文件(renren-generator)的时候出现的问题。仅供参考。问题一:idea一直build。我遇上的情况是可以这么解决的。重新下载jdk,然后file->projectstructure->project,选择刚下载的jdk,看清楚位置!!看清楚版本号是不是刚下载的!!!!(因为我太菜了,电脑上下载了有很多jdk和jre,位置也乱七八糟的)继续修改下面的SDKs,和上面同步。然后重新打开idea。重新编译运行也许就好了。Goodluck,祝大家好运。问

    2022年7月28日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号