背景信息分析:

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

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

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

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

我的问题:

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


当前回答


POST 可以执行其他三项功能,但随后请求的语法将失去在中间人,如Caches 和 Proxy. 这也适用于提供资源的安全性,因为一个帖子的 URI 不一定指示它正在应用的资源(但它可以)。


编辑: 另一个事情 - 一个 PUT 可以创建,但如果这样做,那么 ID 必须是一个自然 ID - AKA 一个电子邮件地址。

其他回答

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

PATCH /questions HTTP/1.1

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

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

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

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

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

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

总结

参考

POST 和 PUT 方法之间的基本差异被关闭代表性的不同意图所突出。 POST 请求中的目标资源旨在根据资源的本质处理关闭代表性,而 PUT 请求中的关闭代表性则被定义为取代目标资源的状态。

但建议始终使用更专门的请求方法而不是 POST 适当时,因为它为中介提供更多信息,以自动化信息获取(因为 GET、HEAD、OPTIONS 和 TRACE 被定义为安全),处理通信故障(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效),并优化存储性能(因为 GET、HEAD、PUT、DELETE、OPTIONS 和 TRACE 被定义为无效)。

在实践中,POST为创建资源工作良好.新创建资源的URL应返回位置响应标题.PUT应用于完全更新资源. 请理解这些是设计RESTful API时最好的做法. HTTP规格不限制使用PUT/POST与创建/更新资源的几个限制。

PUT 是用于创建或替换客户端所知道的 URL 的资源。

因此: PUT 仅是 CREATE 的候选人,客户在创建资源之前已经知道 URL。 /blogs/nigel/entry/when_to_use_post_vs_put 因为标题被用作资源密钥

RFC 如下:

注意: PUT 主要用于更新资源(通过将其全部替换为资源),但最近出现了使用 PATCH 来更新现有资源的动作,因为 PUT 说明它取代了整个资源。

從 REST API 設計 - 資源模型 Prakash Subramaniam of Thoughtworks

这迫使API避免多个客户更新一个资源的国家过渡问题,并且更顺利地与事件来源和CQRS相匹配。

或者你可以这样做:考虑你的不安全的请求作为一个极端的单用户资源(让我们称之为行动)。客户要求一个新的“行动”在一个有意义的资源与一个空的POST到资源。

在告诉我这不是RESTful之前,请考虑遵守REST原则的众多方式. 客户不构建URL. API 仍然可发现,尽管在语法中有点变化. HTTP 字母被适当使用. 如果你认为这是一个巨大的变化来实施,我可以从经验中告诉你,这不是。