如何实现部分资源休息API?

时间:2019-04-01 08:39:50

标签: performance rest

为了限制我的REST API答案的大小,我想实现Google performance tip:使用fields查询字符串参数来做部分资源。

如果我有完整的答案GET https://myapi.com/v1/users

[
 {
   "id": 12,
   "first_name": "Angie",
   "last_name": "Smith",
   "address": {
          "street": "1122 Something St.",
          "city": "A city"
          ..and so on...
    }
  },
  ... and so on
]

我将能够过滤它GET https://myapi.com/v1/users?fields=first_name

[
  {
   "id": 12,
   "first_name": "Angie"
  },
  ... and so on
]

这个概念很容易理解,但是我找不到实现它的简单方法!

我的API资源都以相同的方式设计:

  • 使用查询字符串参数进行过滤,排序和分页。
  • 调用具有该参数的服务以执行SQL请求(只有WHERE条件,ORDER BY条件和LIMIT是动态的)
  • 使用转换器将数据格式化回JSON

但是当使用这个新的fields参数时,我需要做什么?在哪里过滤数据?

  1. 我是否只需要过滤JSON输出?但是我将在该示例中对地址表进行不必要的JOIN查询,并在用户表中获取不需要的字段。

  2. 是否需要进行动态SQL查询以准确获取请求的字段并仅在最终用户需要时添加JOIN?然后,转换器将必须很聪明,才能仅转换SQL查询中的可用字段。

我认为,第二种解决方案将产生非常动态,极其复杂且难以维护的代码。

那么,您如何实现具有部分资源功能的REST API?在这种情况下,您的最佳做法是什么?

(我是PHP开发人员,但我认为与该问题无关)

1 个答案:

答案 0 :(得分:0)

如果您的后端在做

GET https://myapi.com/v1/users

这会导致SQL:

select * from users

然后将其转换为JSON,您不仅可以这样做:

GET https://myapi.com/v1/users?fields=first_name,surname,email

获取所有必填字段(PHP实现的粗略概念):

$fields = split(",", $_GET["fields"]);
$sql = "select ";
foreach ($fields as &$field) {
  // do a check to see if the field is ok first...
  if (checkField($field)) {
    $sql += field + "," // deal with commas
  }
}
$sql += " from users";

构建类似的SQL

select firstname,surname,email from users

并将受限数据集转换为JSON?