背景信息分析:

根据 RFC 2616,第 9.5 条,POST 用于创建资源:

使用 POST 方法要求原始服务器接受请求中包含的实体作为请求-URI 在请求线中识别的资源的新子属。

根据 RFC 2616,第 9.6 条,PUT 用于创建或取代资源:

PUT 方法要求关闭的实体存储在提供的请求-URI. 如果请求-URI 提到已经存在的资源,关闭的实体 SHOULD 将被视为居住在原始服务器的修改版本. 如果请求-URI 没有指向现有资源,并且 URI 能够由请求用户年龄定义为新资源。

我的问题:

那么,哪种HTTP方法应该用于创建资源?或者两者都应该得到支持?


当前回答

简而言之:

分析与数据库查询

PUT 您可以想象类似于“UPDATE STUDENT SET 地址 = “abc” 在 id="123”;

在 POST 案例中,如果同一查询多次执行,则在数据库中创建了多个学生记录,数据库状态在每个“INSERT”查询的执行时都会发生变化。

注意: PUT 需要一个资源位置(现有资源),更新需要发生,而 POST 则不需要这样做。

有些人可能會發現這些更新可以用 POST 進行. 沒有嚴格的規則,哪一個要用於更新或哪一個要用於創造。

其他回答

您可以在网页上找到声明说

也不是很正确。


最好选择 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

让我们来介绍一下特区的一些重要部分:

邮件

因此,它在收藏中创造了一个新的资源。

皮特

参考:

雖然可能有一種有趣的方式來描述這些,但它似乎與從答案到網站的不同聲明相矛盾。

如果您是使用 Web API 的.NET 开发人员,事实是(从 Microsoft API 文档), http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations:

1. PUT = UPDATE (/api/products/id)
2. MCSD Exams 2014 -  UPDATE = PUT, there are **NO** multiple answers for that question period.

确保您可以使用“POST”更新,但只需跟随与您提供的框架的协议。在我的情况下,它是.NET / Web API,所以PUT是为了更新,没有讨论。

我希望这有助于任何微软开发人员阅读所有评论与亚马逊和Sun/Java网站链接。

您应该使用 PATCH. 您应该使用 PATCH 等问题列表

PATCH /questions HTTP/1.1

包含您要创建的对象的列表,如

[
    {
        "title": "I said semantics!",
        "content": "Is this serious?",
        "answer": "Not really"
    }
]

您将修改现有资源列表,而无需提供全新的内容,您将从不存在的数据转换为现有信息的状态,而无需提供所有数据(服务器最有可能将添加身份证)。

这个方法的一个很好的优点是,您可以使用单个请求创建多个实体,简单地将所有实体列入列表中。

一个缺点是,可能没有人这样使用PATCH,我害怕,我只是发明了它,但我希望,我提供了一个很好的论点。

至于语法,CREATE是IMHO的唯一正确选择,其余的一切都是一个圆洞的平方点,不幸的是,我们所有的都是圆洞。

POST 意思是“创建新”如在“这里是创建用户的输入,为我创建它”。

PUT 的意思是“输入,如果已经存在,取代”如“这里是用户数据5”。

您 POST 到 example.com/users 因为您还不知道用户的 URL,您希望服务器创建它。

您可以访问 example.com/users/id 因为您想要更换/创建一个特定的用户。

与相同数据两次发布意味着创建两个相同的用户与不同的ID。 与相同数据两次发布会创建用户的第一个,并更新到相同状态的第二次(没有变化)。 因为你结束相同状态后一个 PUT 无论你执行多少次,它被说是“平等强大”每次 - idempotent. 这是有用的自动退休