rest post put_REST / HTTP方法:POST与PUT与PATCH

rest post put

每个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

rest post put

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

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

相关文章

回归模型的score得分为负_深度研究:回归模型评价指标R2_score

回归模型的性能的评价指标主要有:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、R2_score。但是当量纲不同时,RMSE、MAE、MSE难以衡量模型效果好坏。这就需要用到R2_score,实际使用时,会遇到许多问题,今天…

DFS应用——遍历无向图

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 如何对无向图进行深度优先搜索 的idea 并用源代码加以实现; 0.2) 本文还引入了 背向边(定义见下文描述)&#x…

高效的磁力搜索引擎 -_高效的企业测试-结论(6/6)

高效的磁力搜索引擎 -该系列的最后一部分将涵盖其他端到端测试,生产中的测试以及各部分的结论。 进一步的端到端测试和生产中的测试 除了仅验证单个被测应用程序并模拟外部问题的系统测试之外,我们的管道还必须包括完整的端对端测试,以验证…

linux安装mysql phpmyadmin_ubuntu mysql远程连接+phpmyadmin安装

一、如何让ubuntu上的mysql允许远程连接进入MySQL,执行如下命令:use mysql;GRANT ALL PRIVILEGES ON *.* TO username% IDENTIFIED BY password WITH GRANT OPTION;flush privileges; //刷新select host,user from user; //查看是否成功退出mysql;打开su…

DFS应用——找出无向图的割点

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用于找割点” 的idea 并用源代码加以实现; 0.2) 必须要事先 做个specification的是:对于给定图的除开起始vertex的那…

spock测试_将Spock 1.3测试迁移到Spock 2.0

spock测试了解Spock 2.0 M1(基于JUnit 5)的期望,如何在Gradle和Maven中迁移到它以及为什么报告发现的问题很重要:)。 重要说明 。 我绝对不建议您永久将您的现实项目迁移到Spock 2.0 M1! 这是2.x的第一个&…

mysql与jmeter环境变量配置_Java开发技术大杂烩(一)之Redis、Jmeter、MySQL的那些事...

前言毕业答辩告一段落,接下来好好努力工作。Redis遇到的一些问题DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections …

DFS应用——寻找欧拉回路

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——寻找欧拉回路” 的idea 并用源代码加以实现 (源代码,我还没有找到一种有效的数据结构和DFS进行结合,往后会po出…

wiremock 使用_使用WireMock进行更好的集成测试

wiremock 使用无论您是遵循传统的测试金字塔还是采用诸如“ 测试蜂窝”这样的较新方法,都应该在开发过程中的某个时候开始编写集成测试。 您可以编写多种类型的集成测试。 从持久性测试开始,您可以检查组件之间的交互,也可以模拟调用外部服务…

mysql备份七牛云存储_定时备份 Mysql并上传到七牛的方法

多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份)、mysqldump 全量逻辑备份、xtrabackup 增量逻辑备份等。常见的数据存储方式有…

jetty java_Jetty,Java和OAuth入门

jetty java使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 今天尝试Okta。 Jetty是一个小型,高度可扩展的基于Java的Web服务器和servlet引擎。 它支持HTTP / 2&#xff0c…

DFS应用——查找强分支

【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “DFS应用——查找强分支” 的idea 并用源代码加以实现 ; 【1】查找强分支 1.1)如何检测一个图是否是强连通的: 通过执行两…

python中的super用法详解_Python中super函数用法实例分析

本文实例讲述了python中super函数用法。分享给大家供大家参考,具体如下:这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简单说, super函数是调用下一个父类(超类)并返回该父类实例的方法. 这里的下…

java 管理多个进程_管理多个Java安装

java 管理多个进程随着越来越多的Java版本发布,在本地环境中管理多个Java安装将变得更加有趣。 不同的项目可能需要不同的Java版本。 jenv项目是管理Java安装的便捷方法。 它可以在全局,目录和外壳程序级别上设置本地Java安装,并使用易于记忆…

NP-完全性介绍

【0】README 0.1&#xff09; 本文总结于 数据结构与算法分析&#xff0c; 旨在 理解 “NP-完全性” 的idea &#xff1b; 【1】难与易 1.1&#xff09;不可判定问题&#xff1a;正如实数不足以表示 x^2 < 0 的解那样&#xff0c;可以证明&#xff0c; 计算机不可能解决碰…

python发邮件给多个人发送消息_python发送邮件(带附件)、发送给多人、抄送给多人的示例...

python发送邮件(带附件)、发送给多人、抄送给多人的示例#!/usr/bin/env python# -*-encoding: utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMEText#image包可以发送图片形式的附件# from email.mime.image import MI…

camel apache_Apache Camel 3只有2个月的路程

camel apache骆驼队正忙于为 Apache Camel 3.今天&#xff0c;第二个候选版本已构建并发布在暂存库中&#xff0c;供早期的适配器尝试 。 当我自己很忙的时候&#xff0c;我只想写一篇简短的博客文章&#xff0c;以使社区了解Apache Camel 3即将发布&#xff0c;并且我们希望…

浅谈java代理

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java代理机制 的基础知识&#xff1b; 【1】代理相关 1.1&#xff09;利用代理可以在运行时创建一个实现了一组给定接口的新类&#xff0c; 这种功能只有在 编译时无法确定需要实…

织梦mysql安装教程视频教程_织梦DedeCMSV6系统安装步骤教程

DedeCMSV6系统基于PHP7.*MySQL开发&#xff0c;本篇文档将介绍如何下载DedeCMSV6系统&#xff0c;并且通过之前已经部署好的系统环境来安装配置一个安全的站点。准备工作&#xff1a;主机一台(PHP7.0以上MYSQL)域名(做好解析绑定工作)源码下载通过DedeCMSV6系统下载页面可以获取…

无法创建t的通用数组_创建通用数组的问题

无法创建t的通用数组在这篇文章中&#xff0c;我们将介绍一篇全面的文章&#xff0c;其中介绍了创建通用数组的问题。 Java编程语言于2004年9月在Java 5.0“ Tiger”发行版中添加了泛型。 泛型或类型参数化系统在提供类型安全性的同时扩展了Java现有的类型系统。 1.简介 Java具…