我正在设计一个 REST API,多个客户端将使用它来查询数据存储库。我预计这些客户会对回复的数量/详细程度有不同的需求。
假设我可以查询一组书籍。一本书可能有很多属性(比任何单个客户可能感兴趣的更多),甚至可能是子资源,并且客户可能会请求大量书籍,从而导致响应主体大于所需。
因此,我正在研究优化响应大小的方法。这个想法是为 API 客户端提供一些方法来指定响应中应包含多少细节。
我很想知道这个问题以前是如何解决的;哪种机制在实践中运行良好,哪些没有,哪种 API 设计特别 RESTful,哪些不是,等等。
我可以想到的几种方法是客户端如何为响应指定所需的详细程度:
使用
GET
或HEAD
HTTP 方法/动词。前者将返回所有细节,前者仅返回一个子集。这种方法只允许我们区分两个细节层次,所以它的用途有限。
具有一个查询字符串参数,该参数指定(按名称)应在响应中返回哪些属性/属性。例如:
GET /books?include=title,author,publisher,...,preview
这提供了几乎无限的灵活性,但这种灵活性可能难以实际实现和处理(在客户端和服务器端)。
使用不同的媒体类型(每个细节级别一个不同的媒体类型),通过
Accept:
标题选择。我真的不想走那条路。我不确定媒体类型是否适合此目的,而且世界可能无论如何都不需要更多自定义媒体类型。
使用
profile
关系/媒体类型参数。这似乎好一点(不需要额外的媒体类型),但我仍然不确定媒体类型是否是选择响应的“内容”(内容)的正确方法。它们似乎更适合仅用于指定响应的“方式”(格式)。对于书籍集合 (
/books?publishedIn=1980s
),仅返回所有可用数据的一小部分,最重要的是href
,每本书的 a 可以被查询以获取有关单本书的完整数据。这种方法至少有两个问题:
除了链接之外,集合响应中还包含哪些属性
href
?理想情况下,有足够的额外数据来满足大多数客户;除此以外...客户将不得不执行许多额外的查询(每本书一个)来收集他们需要的所有数据。
可能有更多的策略来选择所需的详细程度。我有兴趣了解在实践中哪些方法行之有效,同时又不会对 RESTfulness 造成太大影响。