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

时间:2017-12-07 15:12:48

标签: java spring api spring-boot api-design

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

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

如果有帮助,我们的后端是Java Spring Boot应用程序。

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

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

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

选项1:

/汽车/ 1

{
    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
    }
}

选项2:

/汽车/ 1

{
    id: 1,
    name: "Honda Civic",
    description: "The best car of Honda",
    extraInfo: null
}

/汽车/ 1?信息=额外

{
    id: 1,
    name: "Honda Civic",
    description: "The best car of Honda",
    extraInfo: {
    {
        price: 25000,
        stock: 24
    }
}

选项3:

/汽车/ 1

{
    id: 1,
    name: "Honda Civic",
    description: "The best car of Honda"
}

/汽车/ 1?信息=额外

{
    id: 1,
    name: "Honda Civic",
    description: "The best car of Honda",
    price: 25000,
    stock: 24
}

您怎么看?

2 个答案:

答案 0 :(得分:-1)

然而,不是StackOverflow类型的问题,但仍然是一个非常有趣的问题。

我个人更喜欢选项3.

在代码方面,您甚至可以使用带有额外字段的模型扩展普通Car类。

答案 1 :(得分:-1)

考虑前端,我认为选项1更好。

但它也需要考虑后端,你如何实现基本信息和extraInfo。

此外,我认为您可以查看graphqlgraphql-java。希望它有所帮助。