最近正在进行我自己项目使用的 REST 风格的规范/实现指导,很大部分的参考了参考了 PostgREST 的接口风格。但是遇到了 Embedding Foreign Entities 查询参数的设计问题,示例情景如下:
在用户自己买书的情景下,用户和书籍为一对多关系,现在需要在一个接口中获得满足一定条件的用户列表、同时获得每个用户最近刚买的三本书的需求。
在一些实现里面,是通过 Hypermedia(超媒体)作为其解决方案,在查询 GET:
https://api.example.com/v1/readers?order=created_at.desc&status=eq.online
这样的接口时,会返回如下内容:
[
{
"meta": {
"href": "https://api.vincenting.com/v1/readers/a0f0e-ds012e-aff00f"
},
"id": "a0f0e-ds012e-aff00f",
"name": "vincent",
"created_at": "2015-11-01T17:02:23.212Z",
"books": {
"meta": {
"href": "https://api.vincenting.com/v1/readers/a0f0e-ds012e-aff00f/books"
}
}
}
]
这样使用起来问题不大,但是当 HTTP2 未普及的今天,带来的问题就是多次请求带来的时间问题,以及服务器需要多次进行解析、权限控制等等操作的性能损耗。
于是在 PostgREST 后面的版本里面加入了:Embedding Foreign Entities 的内容,支持这样的情况下的内容返回。基本思路是对 select
参数进行拓展,显示的申明我需要返回例如 books 里面的所有字段,于是请求的地址变成了 https://api.example.com/v1/readers?order=created_at.desc&status=eq.online&select=*,books{*}
,从而服务器会将整个满足条件的内容返回。
于是,可能是 PostgREST
目前不支持或者目前对 PostgREST
的理解有限,对于这种列表(虽然是内嵌的列表),至少需要满足:
最终目前的疑惑是:
注:目前参考的其他文献: