为了限制我的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资源都以相同的方式设计:
WHERE
条件,ORDER BY
条件和LIMIT
是动态的)但是当使用这个新的fields
参数时,我需要做什么?在哪里过滤数据?
我是否只需要过滤JSON输出?但是我将在该示例中对地址表进行不必要的JOIN查询,并在用户表中获取不需要的字段。
是否需要进行动态SQL查询以准确获取请求的字段并仅在最终用户需要时添加JOIN?然后,转换器将必须很聪明,才能仅转换SQL查询中的可用字段。
我认为,第二种解决方案将产生非常动态,极其复杂且难以维护的代码。
那么,您如何实现具有部分资源功能的REST API?在这种情况下,您的最佳做法是什么?
(我是PHP开发人员,但我认为与该问题无关)
答案 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?