如何实现部分资源 REST API?



为了限制我的 REST API 答案的大小,我想实现 Google 性能提示:使用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开发人员,但我认为这与这个问题无关)

如果你的后端正在做

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?

最新更新