鉴于我有一个表示城市的模型,其中包含街道的集合。
public class City {
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Street> Streets { get; }
}
public class Street {
public int Id { get; }
public string Name { get; }
public IEnumerable<Building> Buildings { get; }
}
如果客户对所有城市(api/cities/all
)感兴趣并且我将全部收集归还给他,那么这将导致大量响应,具体取决于数据集。所以我首先想到的是只返回 streets 集合中的 street ids 。然而,这感觉很尴尬,因为虽然 ids 可能对进一步获取街道有用,但它们对客户端没有任何有意义的价值(填充 ID列表没有意义在一个视图上,以显示街道在城市中的内容,不是吗?)。
我的下一个想法是完全放弃 streets 集合,而是提供一个API端点来获取 city 的街道:
api/cities/3737/streets
这样我就可以获取 streets 的完整列表,但是返回的数据不会包含街道所属的任何信息。如果我的客户现在想要显示街道和 city ,他必须进行2次API调用才能获得所需的信息。
返回此类数据的常用方法是什么?
答案 0 :(得分:1)
我会创建2个城市对象,一个仅包含基本数据的城市对象(如ID和名称)和一个包含所有数据的cityDetail对象(包括完整的街道计划)。
根据您的情况,您可以对建筑物重复此模式
然后,您可以在列表调用中返回城市对象,并且只有在执行get by id时才会返回cityDetail对象。
坏=&gt;你的api是排序&#34;不一致&#34;通过列表获得的城市对象与通过get获得的城市对象不同。你可以制作2个资源:city&amp; cityDetail with cityDetail没有List功能和城市没有getByID功能,但它仍然不是那么干净&amp;可预测为单一资源。
好=&gt;性能明智&amp;用法明智,这通常是一个完美的匹配。您永远不会显示街道城市列表,因此城市对象就足够了。当您查看单个城市时,您很可能希望显示包括街道在内的所有数据(或至少在该页面上使用此数据),因此cityDetail对象也适合此处。
性能方面明显的是,为getAllMyCities调用获取1个百万街道是显而易见的;)