REST API +黑客/ REST + RPC混合。我做对了吗?

时间:2016-09-09 15:02:36

标签: rest single-page-application rpc json-rpc

TL; DR 如何在SPA(前端/后端)中混合REST请求和一些非REST请求?或者我可能只是让REST错了?

我们正在为SPA和移动设备(可能还有一些第三方)规划新的API。我想,会有一些请求无法被REST覆盖。

我主要讲的是会使后端做某事的请求,这会根据文档修改文档状态或提供一些额外信息,但请求本身相当简单。

这是一个非常简单的例子。我想在博客文章中添加评论。例如,我可能会这样做:

  1. 创建评论。 POST /comment
  2. 在作者和评论之间建立联系。 POST /comment_authorPUT /comment author_id
  3. 在评论和帖子之间建立联系。 POST /comment_postPUT /comment post_id
  4. 我也可以使用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的看法是对吗?

1 个答案:

答案 0 :(得分:0)

我会使用GET /comment_stats/:comment_id来正确分离关注点,以便报告代码不会使comment资源混乱。

如果您实际上没有comment_stats文档,或者您的后端如何表示数据,则无关紧要。 REST API只是对后端的抽象。

一般情况下,对于任何非CRUD这样的动作,无论如何最好创建一个新资源并像处理它一样处理它:你向机器发送一些指令(通过GET或POST调用) )。机器执行它然后返回结果。一个简单的例子是转换图像的端点:您创建一个/image_converter端点(机器),将图像POST到它,它转换它,然后发送回图像。 /image_converter在数据库中没有关联的实体/文档,但对于最终用户,它仍然是具有逻辑行为的资源。