有的观点认为,应该用 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方法。

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

国外文章摘录,具体忘记名称作者和 url 了~

转载于:https://blog.csdn.net/mad1989/article/details/7918267

(SAW:Game Over!)

Http / Put 和 Post 区别相关推荐

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

  10. 判别模型和生成模型的区别

    20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...

最新文章

  1. 深入剖析SolrCloud(一)
  2. html中调用flex中的函数
  3. oracle存储技术,oracle存储体系总结
  4. python生成奇数列表_python3:列出一个不需要迭代的奇数列表
  5. 我记录网站综合系统 -- 技术原理解析[0:简介(代序) 1.7Beta源代码下载开始]...
  6. 一文解读光纤收发器单模和多模的区别!
  7. 锁表的进程和语句,并杀掉
  8. java联合主键_hibernate联合主键映射(注解版)
  9. PostgreSQL11.7逻辑复制的搭建
  10. Mongodb Geo2d索引原理
  11. Atitit 签名规范 attilax总结 安全签名规范 v2 r99.docx
  12. node_modules删不掉
  13. 软件是用计算机解决问题的过程,1.1 计算机解决问题的过程
  14. maya arnold渲染器产品快速灯光渲染模板文件下载
  15. Leetcode 684: 冗余连接 Redundant Connection
  16. 一线城市,一个人打拼更不易
  17. luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
  18. Kotlin 编程核心基石—高阶函数
  19. 炫酷的windows快捷关机方式汇总
  20. 免费刷题!初级软件测试面试题目和答案这个小程序很全

热门文章

  1. 用计算机上的画图制作贺卡,用画图制作贺卡
  2. 【OS】期末总结复习
  3. C 语言判断大端小端
  4. k8s minikube在wsl中通过nodeport来访问
  5. 阿里云ubuntu软件包镜像源地址
  6. 使用ssh连接WSL
  7. 【收藏】使用Docker搭建MySQL服务
  8. golang函数:命名返回值代码示例
  9. helm search搜索charts命令
  10. linux批量为文件名添加前缀脚本示例