【问题标题】:Various collections of resources in a CRUD REST APICRUD REST API 中的各种资源集合
【发布时间】:2013-03-03 23:16:47
【问题描述】:

我很好奇 CRUD REST API 将如何实现tweets 资源的想法。当然,诸如 Twitter 之类的应用程序具有 tweet 对象的概念,但应用程序以各种方式需要这些对象(“集合”)。

Twitter 需要一个端点用于user 时间线(tweets 由某个用户发布)和home 时间线(用户正在关注的人的推文时间线)。我想,在 CRUD API 中,user 时间线将位于一个 URI,例如:tweets?filter={username:"Bob"}

但是,我不太确定 CRUD API 设计将如何实现 home 时间线推文集合。此外,用户的集合(例如 favourites)——它们是否完全被视为单独的资源,或者它们是否应该以某种方式附加到 tweets 资源?

此外,Twitter 并没有在其 API 中使用 CRUD 设计。也许这有充分的理由?

【问题讨论】:

    标签: api twitter crud


    【解决方案1】:

    资源设计的好处在于它并不重要,只要它(某些)有意义。显然有些细微差别已经到位,但让我们直奔主题。商业模式不必(必须)将 1:1 映射到资源,这可能就是您在 Twitter API 中找不到这种关系的原因。

    一些假设:时间线是预先定义的,他们的行为是不可影响的,其他的通过创建新的推文。收藏夹是(引用)推文。收藏夹是有影响的。

    最喜欢的收藏资源,可能是这样的:

    • /user/bob/favorites

    您的“CRUD”操作可能类似于:

    • [POST] /user/bob/favorite { "tweet_id": "343fe4a" } -- 添加新收藏
    • [GET] /user/bob/favorite -- 用户 Bob 的所有收藏夹
    • [DELETE] /user/bob/favorite/343fe4a -- 删除推文 343fe4a 为收藏

    通常最好避免在单个资源中使用多个变量,因为这会引入某种不需要的复杂性。然而,在此示例中,收藏夹没有自己的标识符。相反,它重用了推文中的标识符,并且还与用户紧密耦合。

    如果收藏夹确实有它自己的标识符,我会创建一个类似的资源:@​​987654329@ 这可以返回元数据或充当 HTTP GET 方法的推文的别名(重定向)或资源“不喜欢”的东西(DELETE 方法)。

    如果我们不谈论推文,而是谈论包含文章和 cmets 的博客,这种说法可能更有意义:

    • /blog/article/42 -- 代表一篇文章
    • /blog/article/42/comments -- 代表本文所有 cmets 的集合
    • /blog/comment/44571 -- 代表一条评论

    根据您的需要,一些时间线示例可能是以下资源:

    1. /user/bob/timeline/home
    2. /user/bob/timeline?type=home
    3. /timeline/home?user=bob

    正如我之前提到的,最好避免在一个资源中使用多个变量。我可能会选择选项 3。除了具有太多变量的复杂性之外,原因是这样的资源可能不值得缓存(客户端),并且可能不会对其执行 CUD 操作。因为它很可能是不同实体的聚合资源。

    几句结束语:

    • 先设计资源,然后再提出匹配的 URL
    • 不要将资源与(业务)模型进行 1:1 设计
    • 从一开始就不要过度考虑情况。实现一些东西并对其进行修补,以查看将来可能出现的问题。满意后,将其投入生产。

    进一步阅读的建议:

    【讨论】:

    • 信息量很大。我在 Stack Overflow 上得到的最佳答案之一。谢谢@Dynom!
    • 不应该 /user/bob/favorite 被 PUT 而不是 POST 吗?
    • PATCH/PUT 和 POST 主要具有语义含义。在此示例中,您将在推文和用户之间创建新的关系(=like)。创建东西通常是一个 POST 请求。但是,如果您阅读它就像将关系从无到有更新,那么 PUT 可能是合适的。
    • 同意。但是请求必须是幂等的
    • POST 通常不是,但它可以。这取决于实施。在这种情况下,POST 和 PUT 之间的区别不是很重要恕我直言。它与更复杂的资源非常相关(其中 PUT 允许您取消设置先前定义的字段)。在这种情况下,我可能会以完全相同的方式处理 POST 和 PUT 请求。
    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多