Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要选择哪个选项来设计此API端点_Java_Spring_Api_Spring Boot_Api Design - Fatal编程技术网

Java 要选择哪个选项来设计此API端点

Java 要选择哪个选项来设计此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?或者,您会为每个请求返回不同的对象吗 对于我来说,在请

假设我们有一个API端点:/cars/1,它返回关于汽车的基本信息(id、名称、描述)

但是我们也可以请求GET/cars/1?info=extra,这也会返回关于汽车的额外信息(价格、库存)。这些额外的信息作为另一个表存储在我们的数据库中,这个表与汽车有一对一的关系

如果有帮助的话,我们的后端是一个JavaSpring引导应用程序

返回数据的方法有很多种。您会在两个请求中返回相同的对象吗?info=extra请求中相应的额外参数为null?或者,您会为每个请求返回不同的对象吗

对于我来说,在请求“基本”信息时返回所有空值的好处是使用同一个类映射两个请求,只需更改JPA存储库中的@Query,这样更易于维护

返回所有空值也有一个缺点,即返回许多用户甚至没有请求的无用值。这也使得API更难读取(有人可能认为所有这些值实际上都是null,而它们可能不是)。说到类,我们将有一个MappedSuperclassCar和另外两个类CarBasic和CarExtra,它们都扩展了Car,每个类都有相应的getter来创建输出JSON

选项1:

/汽车/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
}
选项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中已经存在的额外字段。