REST / HTTP方法:POST与PUT与PATCH

每个HTTP请求都包含一个方法 (有时称为verb ),该方法指示对标识的资源执行的操作。

在构建RESTful Web服务时,HTTP方法POST通常用于创建资源,而PUT用于资源更新。 尽管在大多数情况下这很好,但使用PUT进行资源创建也是可行的。 PATCH是资源更新的替代方法,因为它允许部分更新。

一般来说,我们可以说:

  • POST请求在服务器定义的URI上创建子资源。 POST也用作常规处理操作
  • PUT请求在客户端定义的URI处创建或替换资源
  • PATCH请求在客户端定义的URI上更新资源的一部分

但是,让我们多看一些细节,看看如何在HTTP规范中定义这些动词。 这里的相关部分是HTTP RFC(2616)的第9节。

开机自检

RFC将POST的功能描述为:

POST方法用于请求源服务器接受请求中包含的实体作为请求行中Request-URI标识的资源的新下属。

这允许客户端创建资源而无需知道新资源的URI。 例如,我们可以向/ projects发送POST请求以创建一个新项目。 服务器现在可以将项目创建为/ project的新下属,例如: / projects / 123 。 因此,在使用POST进行资源创建时,服务器可以确定新创建的资源的URI(通常是ID)。

服务器创建资源时,应以201(已创建)状态代码和一个指向新创建资源的Location标头进行响应。

例如:

请求:

 POST /projects HTTP/ 1.1  Content-Type: application/json  { "name" : "my cool project" , ...  } 

响应:

 HTTP/ 1.1 201 Created  Location: https: //cool.api.com/projects/123 

POST不是幂等的 。 因此,多次发送相同的POST请求可能会导致创建多个资源。 根据您的需求,这可能是一个有用的功能。 如果没有,则应该进行一些验证,并确保仅根据某些自定义条件(例如,项目名称必须唯一 )创建一次资源。

RFC还告诉我们:

POST方法执行的操作可能不会导致可以由URI标识的资源。 在这种情况下,适当的响应状态是200(确定)或204(无内容),这取决于响应是否包括描述结果的实体。

这意味着POST不一定需要创建资源。 它也可以用于执行一般操作(例如,开始批处理作业,导入数据或处理某些操作)。

POST和PUT之间的主要区别是请求URI的含义不同。 HTTP RFC表示:

POST请求中的URI标识将处理封闭实体的资源。 [..]相反,PUT请求中的URI标识请求[..]内的实体,并且服务器不得尝试将请求应用于其他资源。

对于PUT请求,客户端需要知道资源的确切URI。 我们无法将PUT请求发送到/ projects,并期望在/ projects / 123上创建一个新资源。 相反,我们必须将PUT请求直接发送到/ projects / 123 。 因此,如果我们要使用PUT创建资源,则客户端需要知道(如何生成)新资源的URI / ID。

在客户端能够为新资源生成资源URI / ID的情况下,PUT实际上应优先于POST。 在这些情况下,资源创建通常是幂等的 ,这是对PUT的明确提示。

可以使用PUT创建和更新资源。 因此,将PUT请求发送到/ projects / 123可能会创建项目(如果该项目不存在)或替换现有项目。 HTTP状态代码应用于通知客户端资源是否已创建或更新。

HTTP RFC告诉我们:

如果创建了新资源,则原始服务器务必通过201(已创建)响应通知用户代理。 如果修改了现有资源,则应发送200(确定)或204(无内容)响应代码以指示请求已成功完成。

一般而言,如果确切的资源URI是已知的并且操作是幂等的 ,则PUT通常是比POST更好的选择。 在大多数情况下,这使PUT成为更新请求的理想选择。

但是,对于资源更新,应该记住一个怪癖。 根据RFC,PUT应该用新资源替换现有资源。 这意味着我们无法进行部分更新。 因此,如果要更新资源的单个字段,则必须发送包含完整资源的PUT请求。

补丁

HTTP PATCH方法在RFC 5789中定义为对前面提到的HTTP RFC的扩展。 当使用PUT替换现有资源时,使用PATCH对资源进行部分修改。

引用RFC:

使用PATCH [..],封闭的实体包含一组指令,这些指令描述应如何修改当前驻留在原始服务器上的资源以产生新版本。 PATCH方法影响由Request-URI标识的资源,并且可能对其他资源也有副作用。

因此,类似于POST的PATCH也可能会影响请求URI所标识资源以外的资源。

通常,PATCH请求使用与应更新的资源相同的格式,而忽略了不应更改的字段。 但是,不必一定是这种方式。 也可以使用单独的修补程序格式 ,该格式描述了如何修改资源。

PATCH既不安全也不是幂等的 。

也许您想知道在哪些情况下部分资源更新不是幂等的。 这里的一个简单示例是将项目添加到现有列表资源中,例如将产品添加到购物车中。 多个(部分)更新请求可能会将产品多次添加到购物车中。

翻译自: https://www.javacodegeeks.com/2020/02/rest-http-methods-post-vs-put-vs-patch.html

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

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

相关文章

判断frame是否已创建_类的创建

1. 士兵 许三多 有一把 AK47 2. 士兵 可以开火 3. 枪 能够 发射 子弹 4. 枪 装填 子弹---增加子弹数量 class Gun:def __init__(self,type):self.type type# 刚开始枪没有子弹self.bullet_count 0def __str__(self):return ("%s 已到位" % self.type)def shoot(sel…

mysql 安装盒子_Windows2008 装 MySQL 问题

昨天在2008里装MySQL,遇以了一些问题,装的是mysql-5.6.20-winx64.msi版本,不知道是版本太新还是兼容,还是系统权限配置问题,老是报错,多数是杂乱的错误,这里主要记一下MySQL的错误:安…

@select注解_Mybatis基本知识十七:Mybatis注解式开发-单表注解式开发

上一篇文章:《Mybatis基本知识十六:查询缓存之第三方查询缓存》若文中有纰漏,请多多指正!!!1.前言使用Mybatis进行开发,不仅可以使用mapper配置文件进行开发,也可以使用注解的方式。映射文件中无…

mysql主从切换机制torch_MySQL Replication设置(Master/Slave)实现主从复制

一、Master配置1、my.cnf配置# vim /etc/mysql/mariadb.conf.d/50-server.cnf[mysqld]log-binmysql-bin //[必须]启用二进制日志server-id140 //[必须]服务器唯一ID,默认是1,一般取IP最后一段2、重启mysqlsudo service mysql restart3、在主服务器上建立…

junit测试线程_一个在自己的线程中运行测试的JUnit规则

junit测试线程有时,能够在单独的线程中运行JUnit测试会很有帮助。 特别是在编写与封装的ThreadLocal或类似对象进行交互的集成测试时,这可能会派上用场。 单独的线程将隐式确保每次测试运行都未初始化threadlocal的与线程相关的引用。 这篇文章介绍了提供…

maven servlet配置_第一个Servlet配置

使用IntelliJ IDEA创建一个Simple Maven项目2. Add Framework Support3. 配置Tomcat打开菜单Run -> 选择Edit Configuration 如果侧边栏没有Tomcat,点击“”号 -> 选择“Tomcat Server” -> 选择“Local”,到此画面 ,Apply -> OK4. 在Tomcat…

如何将四元数方向转化为旋转举证_是否有将四元数旋转转换为欧拉角旋转的算法?...

frodo2975..7我一直在寻找类似解决方案的几天,我终于遇到了这个网站,它有一个将四元数转换为任意Euler和Tait-Bryan旋转的算法!这是代码:///// Quaternion to Euler///enum RotSeq{zyx, zyz, zxy, zxz, yxz, yxy, yzx, yzy, xyz, xyx, xzy,xzx};void twoaxisrot(double r11, do…

使用Spring Boot和DJL进行深度学习

总览 这是Spring Boot上的另一篇文章 ,该文章将展示如何使用Deep Java Library (DJL)构建示例Web应用程序, Deep Java Library (DJL)是Java的开源深度学习库,用于诊断X射线图像上的COVID-19。 …

ad域管理与维护_U-Mail邮件系统LDAP/AD同步极大提升办公效率

每一位办公族,可能都遇到过这样的问题:1、随着信息化高速发展和企业“互联网”的深入,越来越多的办公平台和软件被开发出来,正如移动互联网端APP应用层出不穷一样,给人们带来了极大地便利性。2、凡事有利有弊&#xff…

r java_如何在R中使用JAVA写的程序包?

不过我对 Java 真的不太熟悉,按照教程调用这个 LLDA 包之后只会使用 inferencer。如果你不嫌麻烦可以考虑先用 Java 计算出结果,然后在 R 中载入这些结果.具体步骤如下:0 - 文件夹 JGibbLDA-v.1.0 放在 R 的工作目录下。1 - 用 JDK 和他提供的…

c语言c99标准_C语言的灵魂指针,配合这个新增的关键字,能够生成更高效的程序...

正如我前面的文章提到的,C语言虽然已经比较成熟,但是近些年来也是有所发展的——比如增加了许多新特性。遗憾的是,可能因为C语言程序员的工资比不过互联网程序员,国内很多教材比较老旧,几乎不涉及近些年来C语言新增的新…

java ee的小程序_Java EE 8 –为更多设备提供更多应用程序

java ee的小程序如果我不喜欢夏天的一件事,那就是事实是没有太多要分享或谈论的新闻。 谁决定将Java Day Tokyo置于今年的这个无聊的时间里,做得很好,并给了我一个写关于新的和即将到来的Java EE 8规范的博客帖子的机会,其中丰富了…

java随机姓名_Java生成随机姓名、性别和年龄的实现示例

一、定义实体类Person,封装生成的数据package net.dc.test;public class Person {private String name;private String sex;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public String getSex() {r…

matlab 图像 幅度谱 低通滤波_数字图像处理期末复习2018-12-21

数字图像处理期末复习2018-12-21愉快先生0.204字数 5547 阅读 18342018-12-22 19:35(数字图像冈萨雷斯第二版教材)一、基本原理图像的读取、存储操作:i imread(filename) ; imwrite(i,’image.jpg’); 图像显示的⽅法及区别:imshow(i); imshow(i,[]);%0…

带有HttpClient的自定义HTTP标头

在Apache HTTPClient请求中设置自定义HTTP标头的快速指南。 在HttpRequest上,调用setHeader()方法以将HttpHeaders内容类型设置为JSON。 适用于各种版本的HttpClient(4.3之前和之后)。 1.简介 在本教程中,…

java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

package com.yc.test;import java.util.ArrayList;import java.util.List;import com.yc.tree.ThreeLinkBinTree;import com.yc.tree.ThreeLinkBinTree.Node;/**** author wb**遍历二叉树指的是按某种规律依次访问二叉树的每个节点,对二叉树的遍历过程就是将非线性结…

大话oraclerac集群、高可用性、备份与恢复_Oracle RAC结构

Oracle RAC结构Oracle真正集群的出现是在Oracle公司收购Rdb并吸收了相关技术优势后,才正在推出了属于自己的RAC集群解决方案。RAC​和集群分类章节提到的集群系统有很多相似之处,从下图我们大概了解一下RAC集群的层次结构和所需的软硬件环境。Oracle Rac…

java obix_obix协议在java中的配置和使用详解

前言本文主要给大家介绍的是关于obix协议在java中的配置和使用,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。什么是 oBIX?简单来讲,obix是一种 XML 通讯协议,使用Http Request/Post方式进行数据通…

java7和java8切换_仍不切换到Java 8的6个理由

java7和java8切换Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后,就该退出了,避免吃盐。 所有的好东西都是有代价的,在这篇文章中,我将分享Java 8的主要痛点。请确保在升级和释放7之前您已经意识到了这些痛点。 1.并行…

python求阶乘之和_python计算阶乘前n项和

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i1就等于几,当然python中是没有…