【转】HTTP协议中PUT和POST使用区别

    有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源;有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源;还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一个资源。这些观点都只看到了风格,争论起来也只是争论哪种风格更好,其实,用PUT还是POST,不是看这是创建还是更新资源的动作,这不是风格的问题,而是语义的问题。



在HTTP中,PUT被定义为idempotent的方法,POST则不是,这是一个很重要的区别。



   “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.”



上面的话就是说,如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的。



      举一个简单的例子,假如有一个博客系统提供一个Web API,模式是这样http://superblogging/blogs/post/{blog-name},很简单,将{blog-name}替换为我们的blog名字,往这个URI发送一个HTTP PUT或者POST请求,HTTP的body部分就是博文,这是一个很简单的REST API例子。我们应该用PUT方法还是POST方法?取决于这个REST服务的行为是否是idempotent的,假如我们发送两个http://superblogging/blogs/post/Sample请求,服务器端是什么样的行为?如果产生了两个博客帖子,那就说明这个服务不是idempotent的,因为多次使用产生了副作用了嘛;如果后一个请求把第一个请求覆盖掉了,那这个服务就是idempotent的。前一种情况,应该使用POST方法,后一种情况,应该使用PUT方法。


 

      也许你会觉得这个两个方法的差别没什么大不了的,用错了也不会有什么问题,但是你的服务一放到internet上,如果不遵从HTTP协议的规范,就可能给自己带来麻烦。比如,没准Google Crawler也会访问你的服务,如果让一个不是indempotent的服务可以用indempotent的方法访问,那么你服务器的状态可能就会被Crawler修改,这是不应该发生的

 

一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下,GETHEADPUTDELETE 等方法都是幂等的,而 POST 方法不是。所有的 safe 方法也都是幂等的。

幂等性只与后端服务器的实际状态有关,而每一次请求接收到的状态码不一定相同。例如,第一次调用DELETE 方法有可能返回 200,但是后续的请求可能会返回404DELETE 的言外之意是,开发者不应该使用DELETE方法实现具有删除最后条目功能的 RESTful API。

需要注意的是,服务器不一定会确保请求方法的幂等性,有些应用可能会错误地打破幂等性约束。

GET /pageX HTTP/1.1是幂等的。连续调用多次,客户端接收到的结果都是一样的:

GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   
GET /pageX HTTP/1.1   

POST /add_row HTTP/1.1不是幂等的。如果调用多次,就会增加多行记录:

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

DELETE /idX/delete HTTP/1.1是幂等的,即便是不同请求之间接收到的状态码不一样:

DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created with MySQL 5

设置mysql远程访问报错 ERROR 3009 (HY000): Column count of mysql.user is wrong. Expected 45, found 42. Created withMySQL 50560, now running 50727. Please use mysql_upgrade to fix this error.执行 mysql_upgrade -u root -p 123

Python 数据分析三剑客之 Pandas(三):算术运算与缺失值的处理

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

用sqoop把hdfs数据存储到mysql报错,Job job_1566707990804_0002 failed with state FAILED due to: Tas k failed

用sqoop把hdfs数据存储到mysql数据库,报错 Job job_1566707990804_0002 failed with state FAILED due to: Tas k failed task_1566707990804_0002_m_0、 我遇到这个问题是因为mysql建表的时候varchar(10),而数据里内容大于了10…

Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

【转】wpf和winform的区别

WinForm是Net开发平台中对Windows Form的一种称谓。 WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计…

sqoop(数据迁移工具)-安装-学习

sqoop 1)概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具。 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统; 导出数据:从Hadoop的文件系统中导出数据到关系数…

Python 数据分析三剑客之 Pandas(五):统计计算与统计描述

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

【转】UWP 和 WPF 对比

本文告诉大家 UWP 和 WPF 的不同。 如果在遇到技术选择或者想和小伙伴吹的时候可以让他以为自己很厉害,那么请继续看。 如果在看这文章还不知道什么是 UWP 和 WPF 那么也没关系,下面会告诉大家。 实际上 Universal Windows Platform (UWP) 和 Windows …

Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

错误: 找不到或无法加载主类 org.apache.flume.tools.GetJavaProperty

打开bin下的flume-ng 找到下面,添加红色框内容,即可 如果还有有关hbase的同样的错误(因为hadoop与hbase版本不兼容,更换我这里hadoop-2.7.7,hbase-2.0.6(一开始是2.1.5会出现这个错误)&#xff…

centos7安装telnet后/etc/xinetd.d/telnet下没有telnet

centos7的telnet配置文件是:/etc/xinetd.conf。centos7以前的是/etc/xinetd.d/telnet 因为装好telnet服务之后,默认是不开启服务的,下面我们需要修改文件来开启服务 需要把 disable 改成no

Python 数据分析三剑客之 Pandas(七):合并数据集

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

flume学习-含安装

1.Flume是什么:Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。Flume基于流式架构,灵活简单。 Flume组成架构 下面我们来详细介绍一下Flume架构中的组件。 1) Agent&#xff1…

Python 数据分析三剑客之 Pandas(八):数据重塑、重复数据处理与数据替换

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

【转】使用Azure Rest API获得Access Token介绍

1. 前言 本文主要描述了以java应用为客户端,使用Azure Rest接口的认证过程,帮助快速完成使用Azure Rest接口的第一步。 2. 读者 本文适合开发人员、IT运维人员阅读。 3. 方案架构说明 在我负责的某大型国企客户提出的混合云战略是:不仅要…

Flume-ng运行出错: Caused by: java.net.BindException: 地址已在使用org.apache.flume.lifecycle.LifecycleSupervis

Flume下杀死collector再恢复出现错误 2019-08-29 15:57:52,578 (lifecycleSupervisor-1-5) [ERROR - org.apache.flume.lifecycle.LifecycleSupervisor$MonitorRunnable.run(LifecycleSupervisor.java:251)] Unable to start EventDrivenSourceRunner: { source:Avro source r…

Python 数据分析三剑客之 Pandas(九):时间序列

CSDN 课程推荐:《迈向数据科学家:带你玩转Python数据分析》,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员;已出版《跟老齐学Python:轻松入门》《跟老齐学Py…

Flume-ng 高可用搭建-与测试

前提: 1)五台虚拟机(三台也可以) 2)flume单节点测试并学会 3)hadoop集群搭建完成 Flume NG集群,架构图 Flume的存储可以支持多种,这里只列举了HDFS 角色分配 名称HOST角色Agent1chun1Web ServerAgent2chun2Web Ser…

【转】D365 FO第三方集成(一)---访问认证(应用注册)

从Axapta3.0的COM Business Connector,到AX4.0和AX2009的 .NET Business Connector,到AX2012的WCF Services,最后到D365FO的接口方式。 AX的接口演化,几乎见证了微软整个技术栈的变迁。 D365 FO的Web Services比起AX2012有了飞跃&…

【转】Postman系列一:Postman安装及使用过程中遇到的问题

一:Postman的简介、下载安装及界面说明 1.Postman的简单介绍 Postman是一款强大的网页调试和发送网页HTTP请求的工具,Postman让开发和测试人员做API(接口)测试变得更加简单。在我使用Postman之前还有一个版本,就是需要…