REST API渴望还是懒惰?

时间:2016-09-22 20:59:01

标签: json rest

什么更好?当一个实体查询REST端点时 - 立即返回所有实体和子实体,然后使用一些客户端代码在UI上显示它们(让我们称之为'渴望'模式),或者最好返回主要实体首先而不是它的子实体,返回那些子实体id,然后让UI注意并为每个id发出正确的REST请求? (我们称之为lazy模式)。

所以要返回这个JSON(这实际上不是一个有效的JSON,只是离开了region:前缀,你可以理解它是什么实体):

country: {
 name: 'C1',
 regions: [
   region: {
      id: 'I1'
      name: 'R1',
      area: 'A1'
   },

   region: {
      id: 'I2'
      name: 'R2',
      area: 'A2'
   },
]

}

或者这个:

country: {
 name: 'C1',
 regions: ['I1','I2']
}

然后:

GET /rest/region/I1
GET /rest/region/I2

哪一个更好?什么时候用哪个? 谢谢

4 个答案:

答案 0 :(得分:3)

嗯,这取决于,不是吗?

如果数据不会改变,您可以进行急切加载。

如果您提供离线支持,这意味着即使用户断开您希望客户端正常工作的互联网,也必须加急。但它需要一个深思熟虑的客户端框架。

如果频繁修改数据,最好进行延迟加载。

如果数据是安全的,那么最好是将它分成小块而不是一次性完成,但这是可以讨论的。

简而言之,经验法则是,如果您的UI是智能的,而后端是愚蠢的(呃),则需要急切加载,而如果所有业务逻辑都位于后端,而UI只是一种表示,那么请进行延迟加载。

Hybrid也不是一个坏主意。

答案 1 :(得分:3)

这样的决定通常应该根据需要做出,而不是试图预先设计一切。想想谁在使用您的服务(您提到它将在UI中使用)以及要求是什么。

UI是否总是需要加载所有数据?如果是这样,那么延迟加载根本没有任何意义,只会增加客户端代码的复杂性。如果遇到性能问题或者添加另一个不需要所有数据的UI页面,您可以随后在其他URL上实现“延迟加载”。

如果UI默认只显示“顶级数据”,并且更详细的信息仅根据用户的某些输入有条件地显示,那么进入“懒惰模式”是有意义的,因为所有这些数据不是一直都需要的。

实质上,在编写API之前编写UI代码。这将告诉你哪种实现更有意义。

答案 2 :(得分:2)

我不确定这是不是这样做的正确方法,而是我喜欢的东西。

  • 如果嵌套即内部模型相对较小,那么我宁愿使用" eager"模式。没有必要再做一次API调用来获取嵌套模型。保持网络要求最低是我努力的目标。
  • 如果来自嵌套模型的数据要显示在同一个屏幕或页面上,那么我更喜欢"渴望"模式。由于我需要嵌套的模型信息,所以让它进入相同的API调用。在这种情况下,嵌套模型的大小是否很大并不重要。我无论如何都需要它!
  • 如果后续屏幕或页面中需要嵌套模型的数据,那么您可以使用" eager"或者"懒惰"模式,决定使用一个需要花费更多时间的API调用或一系列API调用,每个调用时间相对较短。

您可以看到很多内容取决于客户端应用的运行方式。因此,根据需要做出决定。还要尽量将API调用保持在最低限度。网络请求很昂贵。但是,如果由于嵌套模型中的所有数据而导致任何响应变得太大,除非用户执行某些操作,否则您可能会使用它,然后将其分解为多个API调用。

答案 3 :(得分:1)

我认为这取决于。我会选择第一个,因为你可以减少数据库调用的数量,以及同步AJAX调用的延迟时间(你需要在进行第二次和第三次调用之前获得第一次返回)。

我之所以这样说的原因,是因为如果有大量数据,或者第一个请求因连接或额外数据需要更长的时间,您可以让用户安静地看到第一个结果并让剩余部分加载他们正在查看第一个结果。

这也假设数据在数据库中,用户肯定需要额外的数据。