TL; DR 如何在SPA(前端/后端)中混合REST请求和一些非REST请求?或者我可能只是让REST错了?
我们正在为SPA和移动设备(可能还有一些第三方)规划新的API。我想,会有一些请求无法被REST覆盖。
我主要讲的是会使后端做某事的请求,这会根据文档修改文档状态或提供一些额外信息,但请求本身相当简单。
这是一个非常简单的例子。我想在博客文章中添加评论。例如,我可能会这样做:
POST /comment
POST /comment_author
或PUT /comment
author_id
。POST /comment_post
或PUT /comment
post_id
。我也可以使用POST /comment
和{author_id, post_id}
这样的事情,这实际上看起来最合乎逻辑。
一切都有效,评论添加到blogpost并与作者联系。
现在,客户希望获得他的评论统计数据,例如单词统计数据和字母统计数据。作为请求的一部分,我通过comment_id
。后端可能会使用统计数据更新评论,它可能会创建单独的实体并将其与评论相关联,或者它可能只是向我发送此评论的统计信息而不保存。
那么选择会是什么?
我可以做类似的事情:
GET/PUT /comment/:id/stats
。对我来说似乎已经破解了,因为结果我不想要类型评论的文件,而是不同类型的文件。除了我不发送请求的统计数据,我在后端计算它们所以使用PUT似乎是错误的。POST/GET /comment_stats/:comment_id
。看似合法,但如果我没有类型为comment_stats的文档/实体,这意味着我实际上要求后端创建一些东西,后端会回复我OK/Created
,但实际上我没有这个文件在某个地方保存。所以,虽然我理解REST!= CRUD,但我认为将REST用于简单的CRUD,并且在这种情况下,使用RPC。所以在RPC场景中我只需要调用POST comment.stats(comment_id)
我的问题是在这种情况下会有更好的选择,以及我对rest / rpc的看法是对吗?
答案 0 :(得分:0)
我会使用GET /comment_stats/:comment_id
来正确分离关注点,以便报告代码不会使comment
资源混乱。
如果您实际上没有comment_stats
文档,或者您的后端如何表示数据,则无关紧要。 REST API只是对后端的抽象。
一般情况下,对于任何非CRUD这样的动作,无论如何最好创建一个新资源并像处理它一样处理它:你向机器发送一些指令(通过GET或POST调用) )。机器执行它然后返回结果。一个简单的例子是转换图像的端点:您创建一个/image_converter
端点(机器),将图像POST到它,它转换它,然后发送回图像。 /image_converter
在数据库中没有关联的实体/文档,但对于最终用户,它仍然是具有逻辑行为的资源。