在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。GET/Read 和 DELETE/Delete 很明显。
但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?
在 RESTful 风格的编程中,我们应该使用 HTTP 方法作为我们的构建块。虽然哪些方法与经典的 CRUD 方法相匹配,但我有点困惑。GET/Read 和 DELETE/Delete 很明显。
但是,PUT/POST 之间有什么区别?它们是否与创建和更新一一匹配?
Create = PUT with a new URI
POST to a base URI returning a newly created URI
Read = GET
Update = PUT with an existing URI
Delete = DELETE
根据与 PUT 一起使用的 URI 的存在,PUT 可以映射到 Create 和 Update。
POST 映射到 Create。
更正:POST 也可以映射到 Update,尽管它通常用于 Create。POST 也可以是部分更新,因此我们不需要建议的 PATCH 方法。
整个关键是您是否进行幂等更改。也就是说,如果对消息采取两次行动将导致“相同”的事情出现,就好像它只做了一次一样,那么你就有了一个幂等的变化,它应该被映射到 PUT。如果不是,它映射到 POST。如果您从不允许客户端合成 URL,则 PUT 非常接近 Update,而 POST 可以很好地处理 Create,但这肯定不是唯一的方法;如果客户端知道它想要创建/foo/abc
并且知道要放什么内容,它就可以作为 PUT 工作。
POST 的规范描述是当您承诺购买某物时:这是一个没有人愿意在不知情的情况下重复的动作。相比之下,预先设置订单的派送地址可以用 PUT 来完成:不管你被告知要发送6 Anywhere Dr, Nowhereville
一次、两次还是一百次:它仍然是同一个地址。这是否意味着它是一个更新?可能是……这完全取决于您要如何编写后端。(请注意,结果可能不相同:您可以向用户报告他们上次执行 PUT 的时间作为资源表示的一部分,这将确保重复的 PUT 不会导致相同的结果,但结果仍然会在功能意义上是“相同的”。)
我正在寻找相同的答案,这就是 IBM 所说的。 IBM 链接
POST Creates a new resource. GET Retrieves a resource. PUT Updates an existing resource. DELETE Deletes a resource.
有一个很棒的 youtube video talk bystormpath 实际上解释了这一点,URL 应该跳到视频的正确部分:
同样值得一看的是,如果您考虑花时间构建 REST api,那么它会花一个多小时的时间交谈,但非常有趣。
这取决于具体情况..但总的来说:
PUT = 使用资源的具体 URI 更新或更改具体资源。
POST =在给定 URI 的源下创建一个新资源。
IE
编辑博客文章:
放置:/blog/entry/1
创建一个新的:
发布:/博客/条目
在某些情况下,新资源的 URI 在请求之前是明确的,PUT 可能会创建新资源。POST 也可用于实现其他几个用例(GET、PUT、DELETE、HEAD、OPTIONS)未涵盖的其他用例
对 CRUD 系统的一般理解是 GET = 请求,POST = 创建,Put = 更新,DELETE = 删除
REST 的构建块主要是资源(和 URI)和超媒体。在这种情况下,GET
是获取资源表示的方法(实际上可以映射到SELECT
CRUD 术语中的 a )。
但是,您不必期望 CRUD 操作和 HTTP 动词之间存在一对一的映射。PUT
和之间的主要区别在于POST
它们的幂等性。POST
也更常用于部分更新,这PUT
通常意味着发送资源的全新表示。
我建议阅读以下内容:
HTTP 规范也是一个有用的参考:
PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。
[...]
POST 和 PUT 请求的根本区别体现在 Request-URI 的不同含义上。POST 请求中的 URI 标识将处理封闭实体的资源。该资源可能是一个数据接受进程,一个通往其他协议的网关,或者一个接受注释的单独实体。相反,PUT 请求中的 URI 标识了请求中包含的实体——用户代理知道 URI 的意图,服务器不得尝试将请求应用于其他资源。如果服务器希望将请求应用于不同的 URI,
一般来说,这是我使用的模式: