我们应该何时选用 PUT 或者 POST?
HTTP 的 [POST] 和 [PUT] 并不等价于 CRUD 中的创建(C)和更新(U)。他们服务于不同的目标,只不过在某种情况下可能也可以, 甚至推荐使 [POST] 来创建资源或者使用 [PUT] 来更新资源。
当你可以通过一个特定资源来对其做完整更新,使用 [PUT]。举个例子,当你知道一个文章存在 http://example.org/article/1234, 你可以使用 [PUT] 来直接更新这篇文章的内容。
当你不能确实一个资源的具体公交车,如当你需要创建一篇新文章,但不知道它会存在什么地方,你可以 [POST] 这篇文章到一个 URL,并让服务器决定 它的真正 URL。
PUT /article/1234 HTTP/1.1 <article> <title>red stapler</title> <price currency="eur">12.50</price> </article>
POST /articles HTTP/1.1 <article> <title>blue stapler</title> <price currency="eur">7.50</price> </article> HTTP/1.1 201 Created Location: /articles/63636
当知道新资源的地址,你可能使用 [PUT] 来更新 《blue stapler》这篇文章。但像前面说过的:你也可以通过 [PUT] 来生新一个新资源。下面这个例子, 当 API 提供这个功能,它是完美且合规的:
PUT /articles/green-stapler HTTP/1.1 <article> <title>green stapler</title> <price currency="eur">9.95</price> </article> HTTP/1.1 201 Created Location: /articles/green-stapler
在这里,客户端决定了文章的 URL(注,它们之间不同的是,[PUT] 由前端决定 URL,而 [POST] 由后端决定 URL)。
注意:
- [PUT] 和 [POST] 都是安全该当,但即使如此 [PUT] 是幂等的但 [POST] 不是。