创建已具有ID的多个资源时,PUT与POST

时间:2014-08-01 15:10:09

标签: rest http

我正在构建一个API,其中大多数端点接受并返回多个资源。我在确定是否使用POST或PUT请求时遇到问题。

在我的情况下,始终使用标识符的UUID在API之外创建和标识资源。由于资源已经存在并且已经被识别,因此PUT请求似乎是合适的。但是,在URI中包含每个资源的UUID是不切实际的(UUID很长,单个请求中可能有很多资源)。

POST请求似乎也是合适的,因为即使资源已经使用ID标识,它仍然不存在于我们的数据库中。此外,对于POST请求,不期望在URI中具有ID。

在这种情况下使用哪个正确的HTTP动词?

 PUT /resources/1,2,3 ---> Impractical due to the number of resources per request  
 PUT /resources ---------> More practical but lacks IDs in the URI
POST /resources ---------> Possibly inaccurate verb since resource is already identified

1 个答案:

答案 0 :(得分:4)

我认为你的三个选择是:

  1. 使用PUT /resources/1,然后PUT /resources/2,然后PUT /resources 3。这是“按设计”的方法。它确实会导致3次调用而不是1次,但是您可以利用PUT的优势。

  2. 使用POST /resourcesPOST的正文包含上传到服务器的所有资源的所有详细信息,包括ID。服务器可以从正文中的id创建资源。您失去了PUT的好处,但节省了有线流量。

  3. 使用PATCH /resourcesPATCH的正文包含要创建的资源的所有详细信息。这真的只有在你使用JSON时才有效,因为XML的补丁语义充其量是最好的。语义在RFC 6902

  4. 中描述

    通常不建议对多个ID执行请求。如果你打电话给PUT /resources,从语义上讲,你说你正在用你刚发送的身体替换/resources的内容,这不是你想要的。

    我会建议第一种方法,除非你有充分的理由避免它(测试并有性能问题)。在这种情况下,我会认真考虑PATCH而不是POST