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

标签 java spring api spring-boot api-design

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

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

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

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

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

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

选项 1:

/汽车/1

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

/cars/1?info=extra

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

/cars/1?info=extra

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

/cars/1?info=extra

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

你觉得怎么样?

最佳答案

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

我个人更喜欢选项 3。

就代码而言,您甚至可以使用带有额外字段的模型来扩展普通的 Car 类。

关于java - 选择哪个选项来设计此 API 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47698132/

相关文章:

Java SpringSecurity 使用 HTML GET 参数自动登录

java - 将 Google proto 缓冲区与 Jersey/JAX-RS 相结合

Spring Consul - 禁用单元测试

c++ - 等同于 Windows 操作系统的 Mac OSX API

json - 简单、安全的 API 认证系统

java - 如何将值从一个 JLabel 转移到另一个?

java - 在 Java 流中插入值

java.lang.IllegalStateException : Neither BindingResult nor plain target object for bean name 'login' available as request attribute

java - 启动时未找到 Spring MVC 资源

api - 使用 Flutter 向 Flask API 发送 http Post-Request(包含图像)