使用UUID的REST PUT与POST

时间:2014-10-15 02:59:42

标签: rest http post routing put

如果我使用UUID将实体标识为我的REST端点的URI的一部分:

/entities/<uuid>/

并且UUID是在创建新实体时由客户生成的,就使用PUT vs POST而言,是否有最佳做法?换句话说,UUID由客户端生成,而不是由服务器生成。

如果我使用PUT,是否预期消息有效负载也包含UUID?在这种情况下,消息以及标识实体的URI都将包含UUID

有关规范,请参阅:REST RFC

3 个答案:

答案 0 :(得分:3)

由于您(客户端)已经知道UUID,我认为PUT是最佳做法,并且您不需要在有效负载中包含UUID。不可否认,PUT vs POST有点争议,阅读和重读RFC并不能完全清除它。但我认为前面是正统的。

请参阅PUT vs POST in REST进行讨论。

答案 1 :(得分:1)

了解PUT和POST之间的区别。

PUT旨在用新的URI替换URI指向的资源(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6)。并且它是幂等的,即你使用相同的有效载荷调用它的次数,结果是相同的;它将通过URI提供相同的资源。

因此,如果资源不存在,则已经创建了新资源。即使在这种情况下,结果也是相同的,即它将通过URI提供相同的资源。

POST意味着为URI指向的资源创建子资源(http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5)。如果资源是列表,那么它将向其添加项目。如果它是项目,那么它应该向项目添加一些东西,属性可能是。

因此,理想情况下,如果URI指向的项目不可用,那么它应该是一个错误条件。可能是“404”。 POST就是要添加到现有资源。

提出您的问题,最好使用带有“/ entities /”的POST作为URI,如上所述。您不应该使用POST方法在URI中使用不存在的资源UUID。如果您使用的是PUT,请使用“/ entities /".

POST /entities/ HTTP/1.1
Content-Type: application/json
{
   UUID: <UUID>..
   OtherStuff: ...
}

PUT /entities/<UUID> HTTP/1.1
Content-Type: application/json
{
   UUID: <UUID>..
   OtherStuff: ...
}

响应应该相同

HTTP/1.1 201 Created
Location: http://www.examples.com/entities/<uuid>/

虽然PUT是幂等的但是如果再次使用PUT方法那么它应该使用200或204作为响应。

您的第二个问题:理想情况下,完整的资源详细信息应该在PUT有效负载中,而不仅仅是URI。

答案 2 :(得分:0)

POST和PUT的主要区别:

POST 用于追加新实体。 POST 不是幂等。这意味着如果您发送POST请求十次,您将创建十个不同的实体。通常,您应该获得201(创建)响应代码到POST请求,并且Location头指向新创建的资源的URL。在你的情况下,我建议POST到URL sthm,如

POST /entities/ HTTP/1.1
Content-Type: application/json
{
   UUID: <UUID>..
   OtherStuff: ...
}

响应:

HTTP/1.1 201 Created
Location: http://www.myREST/entities/<uuid>/

PUT 请求用于修改现有状态。 PUT 幂等。通常,您将获得200(OK)响应代码。

您需要在PUT / POST有效负载中包含UUID。 UUID是资源表示的一部分。 PUT和POST都将表示传输到REST服务器,以便更改/附加资源状态。

顺便说一句,你不应该在REST中使用URI术语。 URI是sthm,可能没有表示,尽管URL总是有表示。