如果我使用UUID
将实体标识为我的REST端点的URI的一部分:
/entities/<uuid>/
并且UUID
是在创建新实体时由客户生成的,就使用PUT
vs POST
而言,是否有最佳做法?换句话说,UUID
由客户端生成,而不是由服务器生成。
如果我使用PUT
,是否预期消息有效负载也包含UUID
?在这种情况下,消息以及标识实体的URI都将包含UUID
。
有关规范,请参阅:REST RFC
答案 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总是有表示。