Java 要选择哪个选项来设计此API端点
假设我们有一个API端点:/cars/1,它返回关于汽车的基本信息(id、名称、描述) 但是我们也可以请求GET/cars/1?info=extra,这也会返回关于汽车的额外信息(价格、库存)。这些额外的信息作为另一个表存储在我们的数据库中,这个表与汽车有一对一的关系 如果有帮助的话,我们的后端是一个JavaSpring引导应用程序 返回数据的方法有很多种。您会在两个请求中返回相同的对象吗?info=extra请求中相应的额外参数为null?或者,您会为每个请求返回不同的对象吗 对于我来说,在请求“基本”信息时返回所有空值的好处是使用同一个类映射两个请求,只需更改JPA存储库中的@Query,这样更易于维护 返回所有空值也有一个缺点,即返回许多用户甚至没有请求的无用值。这也使得API更难读取(有人可能认为所有这些值实际上都是null,而它们可能不是)。说到类,我们将有一个MappedSuperclassCar和另外两个类CarBasic和CarExtra,它们都扩展了Car,每个类都有相应的getter来创建输出JSON 选项1: /汽车/1Java 要选择哪个选项来设计此API端点,java,spring,api,spring-boot,api-design,Java,Spring,Api,Spring Boot,Api Design,假设我们有一个API端点:/cars/1,它返回关于汽车的基本信息(id、名称、描述) 但是我们也可以请求GET/cars/1?info=extra,这也会返回关于汽车的额外信息(价格、库存)。这些额外的信息作为另一个表存储在我们的数据库中,这个表与汽车有一对一的关系 如果有帮助的话,我们的后端是一个JavaSpring引导应用程序 返回数据的方法有很多种。您会在两个请求中返回相同的对象吗?info=extra请求中相应的额外参数为null?或者,您会为每个请求返回不同的对象吗 对于我来说,在请
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: null
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
/汽车/1?信息=额外
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
price: 25000,
stock: 24
}
选项2:
/汽车/1
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: null
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
/汽车/1?信息=额外
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
price: 25000,
stock: 24
}
选项3:
/汽车/1
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: null
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda"
}
/汽车/1?信息=额外
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
extraInfo: {
{
price: 25000,
stock: 24
}
}
{
id: 1,
name: "Honda Civic",
description: "The best car of Honda",
price: 25000,
stock: 24
}
你觉得怎么样?然而,这不是一个真正的问题,尽管如此,还是一个非常有趣的问题 就我个人而言,我更喜欢选择3
在代码方面,您甚至可以使用带有额外字段的模型来扩展您的普通
Car
类 >考虑前端,我认为选项1更好。
但是还需要考虑后端,你是如何实现基本信息和外部信息的?
此外,我认为您可以查看和。希望它能有所帮助。我喜欢选项3,但添加了其他课程,但我倾向于一致性。您打算如何返回包含在子类中的特定信息?您的意思是,对于基本返回选项1和额外返回选项2,我们不知道确切的上下文。如果您创建了API,您应该清楚地了解结果应该是什么。例如,如果您有一些UI,并且希望用列“id”、“name”、“description”、“price”、“stock”填充一些表格,而这只是一件您需要API端点的事情,我建议使用端点
/cars/1
,但JSON:{id:1,name:“Honda Civic”,description:“Honda的最佳汽车”,价格:25000,库存:24}
。关于null值,有一条规则“不要显示超出需要的信息”,或者至少显示{}
而不是null。我个人在响应中也维护API请求参数。这样前端就可以相应地决定和解析响应。比如{params:{info:true,extraInfo:false},数据:{id:1,名称:“本田思域”,描述:“诸如此类”,meta:{price:25000,stock:24}}}
我也喜欢这个选项。然而,在可维护性方面,如果有一天我们想添加参数info=extraPrices,我们不能从CarExtra扩展,因为在JPA中并不是那么容易。我们必须创建一个CarExtraPrices,再次从Car扩展,复制CarExtra中已经存在的额外字段。