【问题标题】:Should REST API return nested objects or links to that objects?REST API 是否应该返回嵌套对象或指向该对象的链接?
【发布时间】:2020-05-24 09:00:48
【问题描述】:

与此相关的最佳做法是什么?您能否说这取决于应用程序,或者是否有任何建议表明一种选择优于另一种?

两个选项如下:

1 - 返回嵌套对象

{
  "id": 1,
  "title": "Game A",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"id":1,"name":"Xbox"},
    {"id":2,"name":"Playstation"}
  ]
}

2 - 返回指向该对象的链接

{
  "id": 1,
  "title": "Game A",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"_self": "http://api.example.com/games/1/platforms/53"},
    {"_self": "http://api.example.com/games/1/platforms/34"},
  ]
}

【问题讨论】:

    标签: rest collections nested-object


    【解决方案1】:

    “视情况而定”。

    Caching 是 REST 架构风格中的关键架构约束之一。当我们缓存资源的表示时,我们将整个表示缓存为单个原子;当我们无效时,我们会使整个表示无效。

    以拍卖为例——拍品的表现形式(描述、多媒体文件、出处数据)都变化缓慢;但是当前高出价的表示经常变化。每次有新出价时都获取该大视频会给网络带来很多不必要的压力,因此您可能需要与用于高出价的视频不同的缓存策略——因此,需要多个资源。

    当您要在许多不同的上下文中重复使用相同的表示时,也有类似的考虑 - 想象一个网站,其中每个页面都使用相同的徽标和一致的演示样式。您可能希望缓存徽标和样式表,而不是将它们嵌入到依赖于它们的每个表示中。

    在远程创作用例中,我认为您更有可能嵌入。当一个实体的修改将级联到另一个实体时,问题就出现了——HTTP 支持 cache invalidation 用于不安全的请求,但它没有一个通用机制来宣布应该的 other 资源也作废。

    【讨论】:

    • 我理解这个答案取决于嵌套数据的性质,无论是实时数据还是静态数据。在这种情况下,答案是基于数据的缓存。但是,一般来说,返回所有嵌套数据而不是指向它们的链接是有效的。
    猜你喜欢
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多