在Rest API中对计算字段建模

时间:2014-05-19 18:45:16

标签: performance rest api-design

Restful资源的常见做法是在查询字符串中支持字段选择器。例如,如果资源包含字段A,B,C和D,但客户端仅对字段子集感兴趣(例如A和B),那么Url可能看起来像

  

... / resource / 1 /?fields = A,B //只选择A和B'

现在假设我们向资源添加了另一个属性。具有此属性的是它没有任何物理存储。这是一个计算值。另外假设这个计算非常昂贵

现在显然,Rest并不关心这些事情,无论数据是来自文件还是数据库,还是花哨的算法。

但是这里面临两难选择:'''查询参数始终是可选的。就我而言,省略'字段'意味着"带来所有领域" (很像SQL中的' *'):

  

... / resource / 1 // A,B,C,D和E(xpensive)被选中'

我很肯定有许多现有客户正在使用天真的方法(不打扰指定明确的字段列表)。这意味着添加这个新的重属性将无意中创建性能中断(可能是非常严重的)。

应对这些情况的常用技巧是什么?

我考虑的替代方案:

  1. 向系统添加一个特殊概念,即使用' *'语义不一定会返回所有字段(默认情况下将省略重字段)。如果客户想要他们 - 他必须明确要求
  2. 不要将这些额外属性建模为资源上的字段。而是公开一个将执行计算的专用端点,从而消除可能的混淆,但将Rest-RPC样式引入系统。
  3. 让它成为一个寂静的问题:如果他一开始没有明白的话,对他来说很难。这不是一个真正的选择 - 没有这个特权。

1 个答案:

答案 0 :(得分:1)

我最喜欢选项1。我会考虑将这些字段表示为引用对象,然后您可以通过单独调用重字段来获得HATEOAS样式。这类似于网页的行为 - 返回框架和一些内容,如果用户想要图像,视频等,则强制额外调用 -

看看这个:spring.io/ruderstanding/HATEOAS,这个:timelessrepo.com/haters-gonna-hateoas,这个:stackoverflow.com/questions/tagged/hateoas