使用POST代替PUT REST

18

POST:用于创建和更新资源
PUT:用于更新现有资源

我能用POST代替PUT方法吗?如果我使用POST方法而不是PUT方法,会有什么缺点?

如果POST可以完成PUT方法的工作,为什么还需要PUT方法?

5个回答

28
可以用POST方法代替PUT方法吗?
可以的。例如,HTML表单中的所有写操作都使用POST方法。
如果POST方法可以完成PUT方法的工作,为什么还需要PUT方法呢?
过去是不需要的。在HTTP/1.0中,指定的方法只有HEAD、GET和POST。PUT方法被归类为附录D:附加功能。
如果我使用POST方法而不是PUT方法,会有什么不利之处?
PUT方法是幂等的,而POST方法不是。
如果使用相同的请求方法进行多次相同请求,其对服务器的预期影响与单个请求的影响相同,那么该请求方法被视为“幂等”。
幂等属性仅适用于用户所请求的内容;服务器可以自由地单独记录每个请求、保留修订控制历史记录或对每个幂等请求实施其他非幂等的副作用。
幂等方法之所以与众不同,是因为如果在客户端能够读取服务器的响应之前发生通信故障,请求可以自动重复。例如,如果客户端发送了一个PUT请求,并且在接收到任何响应之前底层连接关闭,那么客户端可以建立一个新的连接并重试幂等请求。它知道重复请求将具有相同的预期效果,即使原始请求成功,响应可能会有所不同。
换句话说,对于PUT请求,客户端可以使用至少一次传递请求的方式,在不可靠的网络上重复发送相同的PUT消息,直到收到响应为止。
(这个保证由服务器提供,并通过给定资源接受PUT消息来传达。这并不是免费的,您需要确保服务器正确处理这些消息。)
请注意,了解这个保证的不仅仅是客户端,还有所有可以看到请求消息的中间组件(代理)--代理不需要返回浏览器询问用户是否可以安全地重试消息--PUT方法表示服务器提供了这个保证。

10

POST请求表示:“这里有一些数据,请使用指定URL上的处理程序解析它,然后对其执行某些有用的操作”

PUT请求表示:“这里有一些数据和一个URL。如果有人对该URL发出GET请求,请返回这些数据”。

它们执行的任务是明显不同的。

你可以使用POST请求来实现与PUT请求相同的结果,但是处理PUT请求的语义是预定义和标准的。


3

主要区别在于POST方法不保证幂等性,而PUT方法必须保证。

也就是说,假设您更新了一条记录以进行增量更新,那么您不能使用POST方法。因为每次用户进行此更新时,记录都将不同,因此用户不能一遍又一遍地尝试并期望相同的结果。而对于PUT方法的更新,用户可以多次尝试该请求,并且无论用户进行多少次更新请求,最终的记录和响应始终都将相同。

大多数人不想给出这种保证,因此他们只使用POST方法,这不是幂等的。但假设您不是在增加任何内容,而只是放置同一个文件,则用户可以期望即使反复调用,也会得到完全相同的fileId和响应,此时您可以使用PUT方法。

对于幂等操作,您也可以使用PUT方法进行插入操作。因此,POST/PUT方法都可用于插入/更新(都提交数据)。开发者可以根据自己的喜好选择如何使用-有些人喜欢将CRUD映射到方法-其他人则根据幂等性选择仅使用POST或PUT方法。


0

使用 POST 和 PUT 可以帮助 REST API 的消费者了解 API 正在发生的事情。例如,在进行 PUT(即更新)操作时,您可能需要某种令牌,以确保正在更新的实体自上次读取以来没有被更改。当实体已经存在时,POST 可能会以不同的方式失败,而只有在更改或不存在时才会失败。真的听起来像您需要查看一些现有的 REST API,并了解它们的工作方式。


0

我相信这取决于开发人员使用哪个。

假设您正在创建记录。如果您的ID字段为空,则表示这是一个创建请求。如果提供了ID,则它是一个更新请求。

开发人员可以区分它。我了解到幂等请求将确保结果相同,但如果您发送ID = 1,那么对于POST方法也是如此。

您可以始终更新记录,即使您发送相同的请求1000次。

您还可以阅读此处的文章详细了解这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接