REST:查询字符串以通过其数组查询资源 属性

REST: query string to query resource by it's array property

很抱歉,如果这是重复的,但我无法找到包含问题答案的主题。

我正在构建一个 MEAN 堆栈应用程序,并且我计划在后端创建 REST API。现在我偶然发现了以下问题。

我有一个资源 /discussion,其中包含用户列表和 posts 本身。资源大致是这样的:

discussion = {
    "name": "discussionName",
    "users": [<arrayOfUsersThatArePartOfThisDiscussion>],
    "posts": [<arrayOfPostsForThisDiscussion>]
}

我想要实现的是列出用户贡献的所有讨论,以便我可以将这些内容呈现给他。现在,我不明白的是什么是最完整的 REST 方式来做到这一点。

我的想法是:

  1. 维护用户的讨论列表。在这种情况下,用户资源大致如下所示:

     user = {
       "id": "myId",
       "name": "MyName",
       "discussionIds": [<listOfDiscussionsImPartOf>]
     }
    

如果这是我的陈述,当用户试图 post 进入他之前没有 post 的讨论时会发生什么? 我的理解是在那种情况下应该执行 POST /disucssions/:id/posts 来创建另一个 post.

但是,谁在更新 user/:userId/discussionIds?那是客户端还是服务器职责? 如果是服务器职责,我如何强制该资源的缓存失效 (user/:userId/discussions)?以便我获得有关以下 GET user/:userId/discussions

的最新数据
  1. 不要在用户资源中维护讨论列表。

在这种情况下,如何过滤该用户参与的讨论? 我正在考虑将查询字符串与 GET 操作一起使用,但是话又说回来,我如何编写查询来根据数组中提供的参数的存在来过滤资源? 为了清楚起见,我正在寻找类似的东西:

GET api.something.com/discussions?where userId in discussion.usersIds

希望你能回答我的问题。提前致谢

Maintain a list of discussions for the user.

是的,很好

what happens when user tries to post into discussion that he previously didn't post? My understanding is than in that case the POST /disucssions/:id/posts should be executed to create another post.

这是您可以做出的选择。

想想我们是如何在网络上做这种事情的。你想向 stack overflow 发送一个问题,所以你加载了一个表单,然后在该表单中键入一堆信息,然后提交。结果是网络浏览器发送了一个 POST 请求,请求目标是...?

好吧,在 Web 上,它是放入表单本身元数据中的任何目标堆栈溢出。您的用户不关心它去哪里,您只需按下按钮。浏览器也不关心 - 它只是将元数据从表单复制到 HTTP 请求中。因此控制表单的权限也可以选择目标资源。

因此,如果您愿意,可以将所有表单提交到同一资源。或者您可以为每种表单提供单独的资源。或者为每个网页的每种表单提供单独的资源。

但真正有趣的选项是识别最重要的网页,如果正确处理表单提交,这些网页将被更改,因为 HTTP 具有缓存失效规则,可防止兼容的缓存重新使用可能具有的响应已根据您的要求进行更改。

唉,当成功的表单处理会修改多个资源,那你就得选择(每个请求只能有一个request-target)。

当然,表单提交只是一个例子:所有个不安全请求(POST/PUT/PATCH等)共享相同的缓存失效规则。

how do I write query that will filter resource based on existence of provided param in it's array?

你没有过滤资源;你得到一个资源,它的表示是按你想要的约束过滤的列表。

/user-discussions?userId=12345

这是一个非常好的资源标识符,其表示是与用户 12345 相关的讨论列表。您如何获得表示是一个实现细节 -网络不关心

一个常见的例子是从查询字符串中提取 userId,然后将其用作准备好的语句中的参数。

使用查询字符串没有什么神奇的(尽管在网络上很方便,因为我们可以使用表单让用户提供 userId 值);将 id 作为路径的一部分也可以。

URI 设计(特别是 URI 的原始形式)是关于识别关心标识符拼写的人,并在他们的不同关注点之间进行权衡(制作文档的作者的关注点是这与正在阅读网络日志的操作员不太一样,而那些与阅读浏览器历史记录的客户不太一样。