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

    文章

    6987

    浏览量

    88931
  • 服务器
    +关注

    关注

    12

    文章

    9107

    浏览量

    85310
  • HTTP
    +关注

    关注

    0

    文章

    504

    浏览量

    31166
  • 客户端
    +关注

    关注

    1

    文章

    290

    浏览量

    16679
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

    OPPO R9S杨版哄抢空 后续还有红色“惊喜版”

    本月20日,OPPO R9s杨定制版“小Phone”正式推出,23日上午10:00,OPPO R9s杨定制版——小phone在OPPO官网正式开售,开售后32秒就被拍完,47分
    发表于 12-26 17:29 5031次阅读

    个安全可验证的方阵云计算外包协议

    为解决计算能力有限的对象(用户)所面临的大维数方阵的高次计算问题,利用云计算平台(云端),提出个安全可验证的方阵云计算外包协议。协议中,用户首先构造个随机置换,再结合克罗内克函
    发表于 01-17 13:50 0次下载
    <b class='flag-5'>一</b>个安全可验证的方阵<b class='flag-5'>幂</b>云计算外包协议

    在高并发下怎么保证接口的性?

    前言 接口性问题,对于开发人员来说,是个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴
    的头像 发表于 05-14 10:23 1800次阅读
    在高并发下怎么保证接口的<b class='flag-5'>幂</b><b class='flag-5'>等</b>性?

    get与post的请求一些区别

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

    分析解决(性)的方法

    这个概念,是个数学上的概念,即:f……(f(f(x))) = f(x)。用在计算机领域,指的是系统里的接口或方法对外的种承诺,使用相同参数对同
    的头像 发表于 10-14 10:08 938次阅读

    Spring Boot实现接口性的4种方案

    个数学与计算机学概念,在数学中某元运算为时,其作用在任
    的头像 发表于 11-08 10:21 994次阅读

    什么是性?的实现原理

    在编程中操作的特点是其任意多次执行所产生的影响均与次执行的影响相同。函数,或
    发表于 01-05 10:40 6106次阅读

    DS5250微控制器的模时序

    用于许多加密算法。任何实现这些算法之的人都必须知道操作大约需要多长时间。本应用笔记描述了如何在DS5250高速、安全微控制器上完成模运算。它列出了运行各种表达式的典型时间,并描述了获取计时的代码流。
    的头像 发表于 01-11 16:02 700次阅读
    DS5250微控制器的模<b class='flag-5'>幂</b>时序

    个注解,优雅的实现接口性!

    除了查询和删除之外,还有更新操作,同样的更新操作在大多数场景下也是天然的,其例外是也会存在ABA的问题,更重要的是,比如执行update table set a = a + 1 where v = 1这样的更新就
    的头像 发表于 08-26 14:36 890次阅读
    <b class='flag-5'>一</b>个注解,优雅的实现接口<b class='flag-5'>幂</b><b class='flag-5'>等</b>性!

    基于接口性解决方案

    接口性是指无论调用接口的次数是次还是多次,对于同资源的操作都只会产生次结果。换句话说,多次重复调用相同的接口
    的头像 发表于 09-30 16:27 427次阅读
    基于接口<b class='flag-5'>幂</b><b class='flag-5'>等</b>性解决方案

    为什么要实现性校验 如何实现接口的性校验

    前端重复提交表单:在填写一些表格时候,用户填写完成提交,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户认为没有成功提交,然后直点提交按钮,这时就会发生重复提交表单请求
    的头像 发表于 02-20 14:14 1178次阅读

    探索LabVIEW编程接口性原理与实践

    性原来是数学上的概念,在编程领域可以理解为:多次请求个资源或执行某个操作时应该具有唯
    的头像 发表于 02-29 10:24 595次阅读
    探索LabVIEW编程接口<b class='flag-5'>幂</b><b class='flag-5'>等</b>性原理与实践