·

PUT和POST的区别

发布时间:2024-08-28 18:43:06阅读量:303
转载请注明来源

我们都知道,PUT和POST是HTTP的两个方法(Method),都可以用来向HTTP服务器提交数据。似乎用哪个都可以,但其实两者还是有本质的区别的。

网上关于两者区别的文章比较多,但有相当一部分绝对是误导人。所以这次特意查看了RFC7231,来澄清二者的区别。

首先直接摘出RFC7231中的的部分关键原文:

The fundamental difference between the POST and PUT methods is highlighted by the different intent for the enclosed representation. The target resource in a POST request is intended to handle the enclosed representation according to the resource’s own semantics, whereas the enclosed representation in a PUT request is defined as replacing the state of the target resource. Hence, the intent of PUT is idempotent and visible to intermediaries, even though the exact effect is only known by the origin server.

Proper interpretation of a PUT request presumes that the user agent knows which target resource is desired. A service that selects a proper URI on behalf of the client, after receiving a state-changing request, SHOULD be implemented using the POST method rather than PUT.

上面这两段描述的关键词就是“idempotent”(幂等),理解了这个词就理解了二者的本质区别。下面就围绕这个词从以下几个角度分析PUT和POST的区别。

1、使用PUT时,必须明确知道要操作的对象,例如:

PUT /customer/doc/1
{
"name": "John Doe"
}

上面的PUT请求明确是对编号为1的文档进行操作,这里编号为1的文档就是要操作的对象。如果该文档不存在,就创建该文档;如果文档已经存在,就直接整个替换文档内容。

2、 有人可能会质疑,上面的例子用POST也可以实现。没错,如果用将上例中的PUT接口改成POST接口,就是这样:

POST /customer/doc/
{
"name": "John Doe"
}

注意这里有一个重要的不同,这里POST请求并不知道要操作的对象,它只是向HTTP服务器提交一篇新文档,由HTTP服务器为该文档产生一个编号。这就是上面从RFC7231中摘出的第二段文字所描述的含义。

3、有人可能会继续质问:用POST也可以用来修改目标资源对象阿。说得还是没错。还是沿用上面的例子,稍作如下改动:

POST /customer/doc/1
{
"description": "I am a student"
}

这里的含义是给编号为1的文档增加一个属性“description”。注意这里有两个不同:

(1)这里编号为1的文档必须是已经存在的文档,否则必须使用PUT;

(2)这里是对目标对象的部分修改。只是增加了一个新属性“description”,之前的属性“name”不受影响。

4、最后简要总结一下,使用PUT时,必须明确知道要操作的对象,如果对象不存在,创建对象;如果对象存在,则全部替换目标对象。同样POST既可以创建对象,也可以修改对象。但用POST创建对象时,之前并不知道要操作的对象,由HTTP服务器为新创建的对象生成一个唯一的URI;使用POST修改已存在的对象时,一般只是修改目标对象的部分内容。

经过了以上4条的分析之后,对PUT和POST的区别应该很清楚了吧?再强调一遍,PUT是“idempotent”(幂等),意味着相同的PUT请求不管执行多少次,结果都是一样的。但POST则不是。就类似于"x=1"这条语句是幂等的,因为无论执行多少次,变量x的值都是1;但"x++"就不是幂等的,因为每执行一次,变量x的值都不一样。

当然,这里讲的都是规范,都是最佳实践(best practise)。如果你在实际开发中,不按这个来,没有人能管得了你;但是当你的REST API要开放给别人使用时,就会和大家所接受的“普世价值”违背,很可能就会发生各种问题。

如果还有疑问,欢迎留言交流讨论:)。

–END–

0 人喜欢

评论区

暂无评论,来发布第一条评论吧!

弦圈热门内容

有兄弟知道李代数那本书比较好吗

目前在做机器人,想学习李代数的知识咨询一下各位大佬

数学圈小众中的小众

运营弦圈这么长时间,我终于发现一个事实就是:小众圈子千千万万,而数学圈则是小众中的小众,才是真正的小众😎!对于这句话是不是有种熟悉的感觉:20世纪代数几何天才很多,但上帝只有Grothendieck一个。😇由于目前弦圈的人气比较低,并且经过我多次艰难的尝试,效果都挺一般,短期内看这个问题应该不太能改善。毕竟我只是个没钱没人脉的普通人,唯有一腔热血😅。但这不影响我的决心和计划,我想要给弦圈引入更多的小众圈子,让大家能够鉴赏更多的小众文化,这种理念是来源于数学的。在我看来,数学是包容的,能够将宇宙万物都融入其内,因此数学文化是开明的,能够跟无数其他文化相互交织,从而碰撞出火花。在是否存在人类大脑永远无法理解的数学结构?这篇文章中,我曾提到宇宙能否完全被数学所解释是一个理念之争,而我所持的观点即是爱因斯坦的那种,所有的一切都能被简洁、美妙、优雅的数学所描述。在了解了很多的圈子,尤其是小众圈子,以及跟不少数学圈外的人交流后,我才发现似乎很难找个一个比数学圈更小众的圈子。大家都说数学+学术实在是太小众了。在我这个沉浸于数学圈多年的人看来,很多其他所谓的小众圈子一点都不小众,比如说二次元圈、铁路迷 ...

如果中国拿了菲尔兹奖,那中国是不是可以算作数学强国了?

我的回答:如果中国有持续培养纯本土菲尔兹奖得主的能力,那么才可算作数学强国。这东西都得谈可持续性,不能因为个别一两个华人拿了菲尔兹奖就觉得很厉害了。现在中国很多杰出的年轻一辈数学家,都是接受过海外教育的,或者在海外任职的,证明中国数学界还脱离不了国外的培养体系。一个中国国籍的学者经过国外的教育后得到菲尔兹奖,与一个华裔学者在国外得到菲尔兹奖,除了能够满足民族自信心外,没多大区别。Yuhang Liu的回答:等中国自己建设的数学期刊进入中科院自己评的一区再说吧。我不记得中国科学-数学是不是一区,别的应该都不是。这也不是什么不合理的要求。Annals 本来也就相当于普林的一个校刊而已。你有足够多学术地位受认可的编辑,然后华人数学家把自己的大作品都往这上面投,学术地位高了,自然国外的牛人也会往中国的期刊投稿。若是连这一步都不敢想象,也不必谈数学强国了。家里蹲大学的回答:谢邀,你是想说最近王虹解决三维Fakeya猜想的工作吗?即使拿了,我也不觉得这么认为,如果一枚菲尔茨奖章就作为数学强国,我想 巴西,越南,韩国,都可以算作数学强国了。如果有一天,本土(所有教育都在国内完成)真的出现了获得菲尔茨 ...

中国教育最大的成功在哪里?谈谈中国教育的优点

珑霖君的回答:清华大学,计算机水平,2018年最新数据,世界第一。一年5000元,四年20000元,相当于3100美元。走绿色通道,学费毕业后再交。去不发达地区就业,学费全免。我堂妹美国加州大学洛杉矶分校,读计算机,一年70000美元,四年280000美元,相当于176万人民币。排名还不如清华大学。二叔的家庭在美国属于中产偏上了,面对这笔巨款也是卖了国内的房才能支付。就这点,我真心觉得中国教育在给寒门学子留出路。数据来源:2018年全球最佳大学排行榜:清华大学计算机专业排名全球第一刚一天就10K的赞,吓尿。————————鉴于答案很火,也跑个题,说两句这种低廉教育的弊端,就是对个人的严重不尊重。我国教育是一种低成本的“工业化”教育,一个班里多个学生的成本也仅仅是多套桌椅,目的是最大程度普及教育,保障尽量多人的受教育权。但是也很容易把所有人培养成一模一样的人,并且充满了粗暴的强制性,我有时候觉得中国的教育根本就不是教育,而是一种强硬的规训。加上我国的这种集体主义,对部分人很摧残。比如我这种很自我的人,极其厌恶这种教育方式,也导致了我对于集体的严重反感。这让我小学和中学这12年很痛苦,到了 ...

国内的教育体系已崩溃?如何客观地看待中国应试教育?

NIO倒闭了嘛的回答:国内的教育体系趁着2024年的就业市场反馈已经崩盘了,大部分人大四和硕士期间的实习日薪还没现在补课的时薪高。绝大部分人读十几年书不如去学捏十年寿司,现在想靠卷高考翻身就跟1900年梭哈科举差不多了。十年前大家只是调侃一下文编理润,但那时候二本靠谱点的考编都是一次上岸,区别就是上哪里的。二本理科读个江苏大学,上海理工这种级别的硕士,三十岁也能混到三十万的年薪。江苏大学和上海理工进个上汽泛亚校招22W当年是有手就行,有点实力的应届生都能拿到30+的年薪。2024年的行情大致就是,高中本科硕士十年的培训完的80%的人时薪是干不过隔壁日本的零工。而且大部分工科硕士的就业环境真比便利店差远了。便利店至少不会爆炸和时不时冒出来一个工伤,也没什么难闻的气味和可吸入粉尘。而文科方面,十几年前大家印象还是硕士还来银行?24年是双非硕士还敢投我们银行的简历?除了编制外,文科整体就业就靠新东方一类的第三产业挽尊,去个新东方还能看见落地玻璃和高楼,不用面对奇奇怪怪的人。而其他招文科的制造业普遍都是杵在车间隔壁开个四五千的月薪,时不时要面对一下油腻领导的骚扰。而现在广告,传媒,游戏,留学这 ...

为何似乎中国大学教育那么烂,却在科技上看似大有成就?

体制老司机​的回答:中国的教育没那么烂。杨振宁对中国教育讲过一段话,大意是:中国的教育模式,对大多数90分以下的学生,是非常好的,能让这些学生更快地成材。美国的基础教育太过注重个性发展,非常的松散,如果不是很优秀的孩子,在美国的教育环境里,容易放任自我,养成一些不良习性。而本身很优秀的孩子,也就是90分以上的孩子,在美国的教育环境里面,反而能够发挥出自己的特长,取得人生的成功。杨振宁这段话比较委婉地批评了,中国的教育,对于那些最优秀的孩子成长,是不利的,对这些人还是不够尊重其个性和自由。所以,中国的教育,能培养出世界上数量最多的基本素质不错的产业工人,也能培养出世界上最多的工程师等中高端人才。但是,中国在最最顶尖的人才教育培养上,和美国等西方最先进的国家相比,还是有明显的差距的。因此,中国的制造业全世界第一,电子产品、玩具服装,以及什么高楼大厦、铁路公路、大水坝等基建工程建设,大型机械等等,都是世界数一数二的。但毫无疑问,在非常基础的科学研究方面,比如物理、化学、数学等等,和英美差距还是较大。在非常尖端的技术上,也有很大的差距。比如说光刻机、芯片、材料等等。杰克马也讲过一段话,大致意思 ...

关于中国教育的根本问题

关于中国教育的根本问题。还是听听两个外国人的一针见血。给大家介绍两个德国人。第一个,名叫西洛特,最近因对中国教育的一番控诉刷爆了中国的互联网。他在苏州一所私立学校当外教,一干就是八年,但春节前,他离职回国了。他是带着挫败感离开的,他说:“我一辈子也无法在中国看到真正的教育!”他在中国看到4岁的孩子背诵拼音,5岁的孩子做加减法。而在德国,8岁的孩子只需要会播种,栽花,除草。从幼儿园起,中国的学生就不断被灌输政治教育,这些对几岁甚至十几岁的孩子来说,简直是天书,就连很多政治老师也搞不懂,这些教育的功能只是为了应付试卷上的标准答案,别无用处,大多数学生的学习目标也是短暂的——为了考试。与此同时,人性教育、逻辑教育却是空白。人性是人格的基础,缺乏人性体验和认识的人,又怎么形成健全的人格呢,连健全的人格都没有,又拿什么爱自己,爱家人,爱社会呢?西洛特还认为,中国教育的扭曲还体现在安全教育方面。很多学校实行的是无缝对接管理,从学生进门到出校门,每一分每一秒都有老师看着,下一个老师不到,上一个老师不能离开。就像看管羊圈一样。放学时,离学校不足50米的地方,是密密麻麻的家长及形形色色的车辆。孩子到家后 ...

弦圈如何完成新手任务和每日任务 - 任务中心介绍

在弦圈你可以完成新手任务和每日任务,然后获得任务奖励。如何进入任务中心界面呢?首先进入个人中心接着在左侧菜单栏,点击任务中心这时我们就能看到新手任务和每日打卡任务。新手任务,顾名思义是给刚注册弦圈的用户准备的一次性任务,目的是让他快速熟悉弦圈的各个功能和板块。每日打卡任务,就是每天都可以完成一次的任务,希望能够给弦圈的用户一种真实的成长的感觉,让大家使用弦圈能够有更多的正反馈。需要注意的是,新手任务完成后,需要前往任务中心领取奖励,而每日任务完成后,奖励会自动发放,无需每次都前往任务中心。

读完了大学依然是社会的底层,那读书的意义是什么呢?

从小学开始到大学毕业,整整16年,读书可以说贯穿了我们每一个人最青春的时候。然而相信很多人都大学以后都会感悟到,自己回学校读书仅仅只是为了一个毕业证,平时要辛辛苦苦的上课,完成各种作业以及学校的要求。结果最后有用的东西没学到多少,时间却浪费在了诸多琐事当中,详细见 中国当前的教育最缺少什么?于是我们不经会想,既然读完书还是底层,还得受社会的毒打,那还读书来干嘛,不如早早的进社会赚取?其实读书对于普通人,尤其是我们底层人而言,好歹也算是条相对公平,且看得到头的出路。对于底层人来说,相对于搞科研、创业、投资等其他出路,读书风险较低、且付出努力能有一定收益。你想想看,如今很多人都觉得读书努力不一定有回报,那更何况其他的出路,风险更是直线上升,所有付出打水漂都算轻的了。除了是一条出路,读书也是教育的一种方式,能让你学习并掌握未来工作生活所需要的某些技能,这无疑有利于你毕业之后的就业问题(虽然学校在培养工作技能方面差强人意)。而且在学校也意味着有很多可能,你可以利用学校的资源去完成一些单独个人完成不了的事情,比如说现在很火的AI大模型,训练一次模型,单单是买GPU就不知道得花多少钱,而且还需要有 ...