背景信息分析:
根据 RFC 2616,第 9.5 条,POST 用于创建资源:
使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。
根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:
PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。
我的问题:
那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?
我认为还有一个有趣的点,没有在这个PUT vs POST问题上分享:
如果您想要一个没有JavaScript的Web应用程序(例如,如果有人使用一个命令线浏览器,如Lynx或一个浏览器插件,如NoScript或Mmatrix),您将不得不使用POST发送数据,因为HTML表单仅支持GET和POSTHTTP请求。
基本上,如果您想要使用逐步改进(https://en.wikipedia.org/wiki/Progressive_enhancement)让您的网页应用程序在任何地方工作,有和没有JavaScript,您无法使用其他HTTP方法,如PUT或DELETE,这些方法仅在HTTP版本1中添加。
您可以在网页上找到声明说
也不是很正确。
最好选择 PUT 和 POST 之间,基于行动的可行性。
PUT 意味着放置一个资源 - 完全取代在特定 URL 上可用的任何东西与不同的东西. 根据定义,一个 PUT 是无能为力. 尽量尽量多次,结果是相同的. x=5 是无能为力. 你可以 PUT 一个资源,无论它以前存在,还是不存在(例如,创建,或更新)!
POST 更新一个资源,添加一个子资源,或引发一个变化. 一个 POST 不是 idempotent,因此 x++ 不是 idempotent。
根据这个论点,PUT是为了创建,当你知道你将创建的东西的URL。POST可以用来创建,当你知道“工厂”的URL或管理者为你想要创建的东西类别。
如:
POST /expense-report
或:
PUT /expense-report/10929
创建:
可以用 PUT 或 POST 进行如下:
更新:
只能以以下方式与PUT进行:
PUT 将资源更新为现有资源ID 作为识别器,在 / 资源 URI 或收集下。
例子: <-- 一般 - 具体 -> URI: website.example/users/john website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源 URI:website.example/users/john/posts/23 website.example - 整个网站用户 - 用户的收集 john - 收集的项目,或资源帖子 - 收集的帖子 john 23
当你使用POST时,你总是提到收藏,所以每当你说:
POST /users HTTP/1.1
POST /users/john HTTP/1.1
它会工作,但你说你想在用户收藏下添加一个资源。
PUT /users/john HTTP/1.1
让我们来介绍一下特区的一些重要部分:
邮件
因此,它在收藏中创造了一个新的资源。
皮特
参考:
除了其他人提出的差异之外,我想添加另一个。
在 POST 方法中,您可以在表格数据中发送身体参数
在 PUT 方法中,您必须在 x-www-form-urlencoded 中发送身体参数
标题内容类型:应用程序/x-www-form-urlencoded
因此,您不能在 PUT 方法中发送文件或多部分数据。
编辑
内容类型“应用/x-www-form-urlencoded”是不有效的发送大量的二进制数据或包含非ASCII字符的文本. 内容类型“多部分/形式数据”应用于提交包含文件、非ASCII数据和二进制数据的表格。
如果你要提交的话
文件,非ASCII数据,和二进制数据
你应该使用邮政方法。
在恢复已经提到的风险下,似乎很重要的是要记住,PUT意味着客户端在创建资源时会控制什么URL。因此,PUT和POST之间的选择的一部分将是关于您可以信任客户端提供正确的,正常的URL,与您的URL计划是什么相一致。
当您无法完全信任客户端做正确的事情时,更适合使用 POST 创建一个新的项目,然后将 URL 返回客户端在回复中。