REST API 设计中的查找或创建习惯用法? [英] find-or-create idiom in REST API design?

查看:39
本文介绍了REST API 设计中的查找或创建习惯用法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有一个对 'name' 有唯一约束的 'user' 资源.您将如何设计 REST API 来处理查找或创建(按名称)用例?我看到以下选项:

say we have a 'user' resource with unique constraint on 'name'. how would you design a REST API to handle a find-or-create (by name) use case? I see the following options:

客户:

POST /user
{"name":"bob"}

服务器:

HTTP 409 //or something else

客户:

GET /user?name=bob

服务器:

HTTP 200 //returns existing user

选项 2:一个请求,两个响应代码

客户:

POST /user
{"name":"bob"}

服务器:

HTTP 200 //returns existing user

(如果用户实际创建,则返回 HTTP 201)

(in case user is actually created, return HTTP 201 instead)

客户:

POST /user
{"name":"bob"}

服务器:

HTTP 409 //as in option1, since no CREATE took place
{"id": 1, "name":"bob"} //existing user returned

推荐答案

我相信正确"的RESTful 方法是:

I believe the "correct" RESTful way to do this would be :

GET /user?name=bob
   200: entity contains user
   404: entity does not exist, so
        POST /user { "name" : "bob" }
           303: GET /user?name=bob
                200: entity contains user

我也是 Post-Redirect-Get 模式的忠实粉丝,这需要服务器使用新创建的用户的 uri 向客户端发送重定向.您在 POST 案例中的响应将在其正文中包含状态代码为 200 的实体.

I'm also a big fan of the Post-Redirect-Get pattern, which would entail the server sending a redirect to the client with the uri of the newly created user. Your response in the POST case would then have the entity in its body with a status code of 200.

这确实意味着 1 或 3 次往返服务器.PRG 的一大优势是在发生页面重新加载时保护客户端免于重新发布,但您应该阅读更多相关信息以确定它是否适合您.

This does mean either 1 or 3 round-trips to the server. The big advantage of PRG is protecting the client from rePOSTing when a page reload occurs, but you should read more about it to decide if it's right for you.

如果这与服务器来回太多,您可以执行选项 2.根据我对 https://www.rfc-editor.org/rfc/rfc2616#section-9.5:

If this is too much back-and-forth with the server, you can do option 2. This is not strictly RESTful by my reading of https://www.rfc-editor.org/rfc/rfc2616#section-9.5:

POST 方法执行的操作可能不会导致资源可以通过 URI 标识.在这种情况下,200 (OK) 或 204(No Content) 是适当的响应状态,取决于是否响应是否包含描述结果的实体.

The action performed by the POST method might not result in a resource that can be identified by a URI. In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on whether or not the response includes an entity that describes the result.

如果您可以偏离标准,并且担心往返,那么选项 2 是合理的.

If you're okay with veering away from the standard, and you're concerned about round-trips, then Option 2 is reasonable.

这篇关于REST API 设计中的查找或创建习惯用法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆