0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

幂等和非幂等请求的一些定义和分析

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-17 10:50 次阅读

最近在做项目的过程中,有一个需求是在客户端 HTTP 请求失败后,增加一个重试机制,然后我就翻了一些有关“重试”的库,找到一个 axios-retry,在了解的过程中,我就发现了里面有一个默认的配置选项:

“By default, it retries if it is a network error or a 5xx error on an idempotent request (GET, HEAD, OPTIONS, PUT or DELETE).

什么意思呢?默认情况下,只有当出现网络问题,是“幂等请求”的 5xx 状态码的情况下,才会发起重试,而这里面并不包含 POST 请求。

我就好奇了,这里面的这个 idempotent request,也就是“幂等请求”究竟是什么意思呢?

带着好奇我就搜索了下,学到了新的知识,这里就跟大家分享下。

幂等请求

幂等请求,英文叫做 Idempotent Request,官方的文档是这个:https://developer.mozilla.org/en-US/docs/Glossary/Idempotent

官方定义如下:

“An HTTP method is idempotent if the intended effect on the server of making a single request is the same as the effect of making several identical requests.

意思就是,如果发出单个请求对服务器的预期效果与发出多个相同请求的效果相同,则HTTP 方法是幂等的。

其实说白了意思就是这个请求发起一次和发起多次,都对服务器结果没什么区别,一次请求后,服务器结果由 A 变成了 B,后面再发多次这样的请求,结果还是 B 不变,那这个请求就是幂等的。

幂等请求分类

我们知道,HTTP 请求一共有 GET、POST、PATCH、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT这些,那哪些是幂等,哪些是不幂等的呢。

安全请求

这里面我们先分析下,其中有的请求就是一些压根不会对服务器产生任何影响的请求,比如说 GET 就是从服务器上读取信息并返回,服务器的数据根本不会被修改,这种请求就是“安全”的请求。

安全请求有哪些呢?GET、HEAD、OPTIONS、TRACE。

具体对如上三种请求的解释见官方文档:

  • GET:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
  • HEAD:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD
  • OPTIONS:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS
  • TRACE:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/TRACE

所以,GET、HEAD、OPTIONS、TRACE 这些请求都是幂等请求。

POST

接下来我们来分析下 POST 请求,这个是幂等的吗?

不是。

因为 POST 请求一般会用作创建一个字段,比如:

POST /add_row HTTP/1.1
POST /add_row HTTP/1.1   - > Adds a 2nd row
POST /add_row HTTP/1.1   - > Adds a 3rd row

每 POST 一次,一个字段就会被创建,所以请求一次的结果和请求多次的结果是不一样的。

所以,POST 不是幂等请求。

PUT

那 PUT 是不是呢?

是。

因为 PUT 请求一般会用作修改一个资源,而且是全部覆盖修改。

所以,发起一次 PUT 请求,服务器资源就被修改为 PUT 请求的内容了,如果再继续发起多次,那最终结果还是不变。

所以 PUT 请求是幂等请求。

DELETE

同理,DELETE 是不是呢?

是。

因为 DELETE 请求是用作删除服务器资源的,发起一次 DELETE 请求,资源就被删除了,在发起多次,结果也是一样的,因为资源已经被删除了。

所以 DELETE 请求是幂等请求。

PATCH

既然 PUT 是幂等请求,那么 PATCH 是不是呢?

不是。

PATCH 这个请求可能大家见的不多啊,这个请求其实和 PUT 类似,也是用来修改资源的,但 PUT 偏向于把整个资源进行修改,而 PATCH 是修改资源的某一部分。

具体 PATCH 的介绍大家可以见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH

原文有一个对 PATCH 是是否幂等的解释:

“A PATCH is not necessarily idempotent, although it can be. Contrast this with PUT; which is always idempotent. The word "idempotent" means that any number of repeated, identical requests will leave the resource in the same state. For example if an auto-incrementing counter field is an integral part of the resource, then a PUT will naturally overwrite it (since it overwrites everything), but not necessarily so for PATCH.

所以,在某些情况下,PATCH 不一定是幂等的,比如服务器的某些资源的某个字段是一个自增技术,那么每 PATCH 一次,这个就会改变一次,而 PUT 往往都是全部覆盖。

所以,在这里,PATCH 不被认为是幂等请求。

CONNECT

这个 CONNECT 大家可能也用的不多啊,CONNECT 请求会被用作启动与所请求资源的双向通信,它可以用来打开隧道。

具体大家可以参见:https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT

所以,这个本身就是一种用来启动双向通信的请求,是一种逐跳请求,请求一次和多次所建立的一些连接次数也是不一样的,所以不是幂等请求。

总结

好了,这里就总结了幂等和非幂等请求的一些定义和分析。

幂等请求有:GET, HEAD, PUT, DELETE, OPTIONS, TRACE

非幂等请求有:POST, PATCH, CONNECT

看完这篇文章,以后大家再问起幂等请求相关的问题,肯定就不会懵了吧!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6512

    浏览量

    87601
  • 服务器
    +关注

    关注

    12

    文章

    8120

    浏览量

    82522
  • HTTP
    +关注

    关注

    0

    文章

    466

    浏览量

    30316
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16339
收藏 人收藏

    评论

    相关推荐

    #工作原理大揭秘 #电路设计 电位分析

    电位电路设计分析
    Mr_haohao
    发布于 :2022年08月10日 09:04:57

    matlab 矩阵运算

    ), 转置如果矩阵大小对于运算不合适,就会出现错误信息。除法定义如下:如果A可逆且矩阵大小合适,则的解是bxA=*bAx\=,bAx=*的解是Abx/=。加法和减法涉及的是元素对元素的运算;而乘除
    发表于 09-22 15:32

    稳态热晕晕效应的数值分析

    【作者】:孙运强;许晓军;习锋杰;陆启生;吴武明;郭少锋;【来源】:《强激光与粒子束》2010年02期【摘要】:运用高斯光束展开的方法,分析圆对称平顶光束在大气传输中的热晕及其晕效应。通过对热晕
    发表于 04-22 11:37

    时间间隔的信号的分析

    采集到的是时间间隔的信号,实际上是有2个数组,个数组是电压,个数组是时间,只不过每两个点之间的时间不同,也即dt不是
    发表于 05-28 08:59

    我用labview中的“统计”VI对信号读取的“总采样数”为1026,为什么不是2的次呢?

    如题(我用labview中的“统计”VI对信号读取的“总采样数”为1026,为什么不是2的次呢?)如何才能得到1024
    发表于 05-18 18:08

    自用的一些库,包括数据库,多语言,公共库

    本帖最后由 inaction 于 2016-5-20 09:41 编辑 自用的一些库,包括数据库,多语言,公共库。目前在SQLServer测试过
    发表于 05-20 09:35

    一些传感器资料,模块资料

    一些传感器资料,模块资料
    发表于 10-07 11:00

    离线计算中的和DataWorks中的相关事项

    多次的结果和执行次是完全样的。严格的定义这里不展开讨论,有兴趣的可以到网上搜下,会有很多介绍。通俗一些说,
    发表于 02-27 13:24

    请问DSP28335函数pow()运算的速度如何?

    大家好! 本人是DSP28335的菜鸟,最近在做计算时需要用到pow()运算,大约能用到4到5次运算,pow()是double双精度运算,不知道这个函数的速度如何,很多资料说双精度运算很慢,不知
    发表于 09-05 11:08

    USB底层信号的一些定义及时序图

    以下是USB底层信号的一些定义及时序图,虽然很简洁,但能理解后,对后续的USB学习是很有帮助的,特推荐给大家!BTW,本月(4月20号周六)在深圳有场很接地气、很容易入门的USB线下、小型技术交流
    发表于 04-08 16:30

    一些labview自定义控件

    一些定义控件,可以让程序界面更加美观。
    发表于 08-20 17:17

    有没有在mcu上可用的快速求x的y次的算法

    最近项目上用到个求x的y次的算法,x、y都是浮点数,算法准备放在stm32f407上跑,虽然C标准库里有pow可以用,但是感觉速度不是很快,请问各路大佬有没有类似的快速算法?或者有没有什么方法可以优化下?
    发表于 04-30 11:00

    C语言中数学使怎样去计算的

    可以使用math.h中的pow函数来进行运算例如2^5为pow(2,5)而^运算符在C语言中为位异或运算符,并不能用于数学的运算困扰了好几天的问题。我太菜了!...
    发表于 07-15 10:32

    一些常用的通信、电源接口接插件的封装名称的总结

    本文是笔者在设计、调试电路时所遇到的一些常用的通信、电源接口接插件的封装名称的总结(对应实物图片都是在网上找的,有一些叫法可能不太样,但是按下面的名字都能在购买时能够搜索到)。1、
    发表于 12-30 08:14

    get与post的请求一些区别

    今天再次看到这个问题,我也有了一些新的理解和感触,临时回顾了一下 get 与 post 的请求一些区别。
    的头像 发表于 09-07 10:00 1148次阅读