我正在开发一个API,它将向最终用户返回数据。在服务器端模型中,我使用了许多具有关联的查找表的代码,以查找与代码相关的描述和其他相关属性。
我很好奇在返回数据方面是否有“最佳实践”。这里的选项是:
选项1:返回代码并为查找列表提供API
在这种情况下,您可能会遇到以下情况:
//An API call to get a person
let person = await this.dataService.getPerson(1); //performs fetch
//{id: 1, first: "Micky", last: "Mouse", gender: 1, countryOfOrigin: "US"}
//An API call to get lookups -- returned as Map();
let genders = await this.dataService.getGenders();
let countries = await this.dataService.getCountries();
//Now I can do the following to get the definition
let gender = genders.get(person.gender);
let country = countries.get(person.countryOfOrigin).description;
console.log("gender.description");
console.log("country.description");
console.log("country.isoA3");
选项2:返回完全填充的对象
//API call to get a person
let person = dataService.getPerson(1);
//{id: 1,
first: "Micky",
last: "Mouse",
gender: "Male",
countryOfOrigin: {
code: "US",
description: "United States of America",
isoA3: "USA",
isoN3: 840
}
}
选项3:使其具有自引用功能
我知道有一个选项,countryOfOrigin可能是指向给定国家/地区的另一个API调用的链接。但是,在我的情况下,大多数用户将要求大量人员而不是单个人员,并以列表形式显示这些人员。因此,如果用户必须查询1000个人,这将对服务器造成很大的冲击然后对服务器执行ping命令1000次,以获取每个countryOfOrigin。
是否有标准或最佳做法可以在此提供一些指导?
答案 0 :(得分:0)
是否有标准或最佳做法可以在此提供一些指导?
并非如此,只是权衡取舍。
我在网络上可以想到的最简单的类比是Java脚本-您应将源代码嵌入页面中吗?还是应该链接到源并单独下载? “取决于情况”-当您希望对缓存策略进行细粒度的控制时,拥有单独的资源非常有用,但是在缓存时,它的糟糕是一种责任而不是资产。
Preacher指出,一种常见的方法是为不同的用例提供不同的资源。
另一种可能性是使用单个资源,但是使用不同的表示形式(媒体类型)来支持不同的用例。
据我所知,这只是缓解痛苦的不同方法。
答案 1 :(得分:0)
您有两种可能的选择:
A。使用支持嵌入资源的api标准。
我倾向于对所有响应都使用HAL,但是HAL并不是解决此问题的好方法。 JSON:API可以更好地处理这种情况。它允许发送关系以及响应,一个好的JSON:API客户端可以获取这些关系并将它们放在临时缓存中。
HAL对此不利的原因是,它没有消除重复关系的好方法。 GraphQL可以很好地处理这种情况,但它不是REST。
B。找出问题的真正原因。
您描述的问题确实是您担心会发出许多HTTP请求,而拥有许多HTTP请求是一件坏事。
有几种方法可以解决这个问题。
Cache-Control
标头,让客户端将标头的副本保留很长时间。这将特别有利于浏览器客户端(服务器上运行的HTTP客户端往往不使用太多缓存)。