为了限制我的 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
参数时,我需要做什么? 在哪里筛选数据?
我只需要筛选 JSON 输出吗?但是我将(在该示例中)对地址表进行不需要的 JOIN 查询,并在用户表中获取不需要的字段。
我是否需要进行动态 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?