2012-06-13 33 views
0

我正在设计一个Restful HTTP API并且有一个设计问题。Restful HTTP API模式

在我的应用程序中,用户应该能够建议物品创建。

然后我可以批准或不批准他们。

我想知道最好的VERB + URL模式是什么。

实施例1:

POST|GET|PUT|DELETE /items 

用户POST一个新的项目和我可以把它从“待定”或删除“认可”。

这里我必须使用GET/items?status = approved来获取所有批准的项目和GET/items?status = pending以获取所有未决项目。也许GET/items会默认给我所有批准的。

但我不明白我可以如何阻止用户将其设置为已批准状态。

例2:

POST|GET|PUT|DELETE /item_creation_suggestions 

用户发布一个新的项目建议,我可以通过DELETE批准:婷,并做一个POST /项或删除它。

这里/ items和/ item_creation_suggestions是两个独立的集合。我只需在批准时删除建议并创建项目。

这使得我的应用程序免受未经授权的访问变得非常简单。我可以通过授权保护我的/物品,而/ item_creation_suggestions可以被任何人使用。

但这似乎不是很安静?

这同样适用于用户建议更新和删除项目时,并且我批准或拒绝这些项目。

我在Restful设计非常新,所以所有的反馈意见和建议,将不胜感激!

回答

2

第一个听起来不错。

POST /items应创建一个新项目,并可能返回202 Accepted状态。
GET /items应返回所有批准的项目。
GET /items?status=pending应将未决项目返回给具有正确权限的用户。
PUT /items/[id]与请求主体指定一个新的状态来改变状态。
DELETE /items/[id]删除该项目。

最后,您需要决定什么对您的 API最有意义,但上述声音通常是合理的。

+0

我不认为Accepted在这里适合;这意味着请求已收到,它在第一眼看来似乎有效,但这可能随请求在后台处理而改变。 – Evert

+0

是的,这取决于目标受众是谁。从用户的角度来看,如果我'POST'一个项目,但它不是立即可见的,就会收到'202'。如果可能还有一个选项立即发布项目,并且区分这两者很重要,那么使用HTTP状态代码很容易。 – deceze

+0

由于201表示它是创建的,所以202接受可能暗示该建议被接受。 – wingy

1

我也非常喜欢第一个设置。

但我不明白我可以如何防止用户将其设置为已批准状态。

如果用户没有权限执行此操作,那么您的应用程序逻辑需要阻止用户在批准状态下POST'ing项目。 REST不仅仅是一个'死存储',你实际上可以处理请求并且抛出一个403 Forbidden以防用户做错了事情。

访问控制仍然很重要,并不违背'安宁'。