
在 api 设计中,直接返回原始列表,特别是包含混合数据类型的列表,是一种应避免的实践。这种做法会破坏 api 的契约清晰性,导致消费者难以解析和理解响应数据,降低可扩展性和可维护性。推荐的做法是将列表封装在一个具有明确字段的自定义数据传输对象(dto)中,以确保强类型、清晰的结构和更好的兼容性。
在构建 RESTful API 时,我们经常需要返回一组同类型的数据。例如,一个返回电影评分的 API 可能最初设计为直接返回一个 Rating 对象的列表:
public class Rating {
private Long movieId;
private Integer rating;
// ... 其他字段和getter/setter
}其 API 响应可能如下所示:
[
{"movieId": 5870, "rating": 5},
{"movieId": 1234, "rating": 3}
]这种设计在功能单一时看似简洁,但当业务需求演进,需要对 API 响应进行增强时,问题便会浮现。
假设现在需要为上述 API 增加一个字段,以指示这些评分属于哪个用户,例如“John Doe”。一种直观但极其不推荐的做法是尝试在现有列表中直接添加这个新信息:
@GetMapping("/ratings-with-user")
public List<Object> foo() {
List<Object> finalList = new ArrayList<>();
finalList.add(new Rating(5870L, 5));
finalList.add(new Rating(1234L, 3));
finalList.add("John Doe"); // 添加一个字符串类型的用户名称
return finalList;
}这样的 API 响应可能看起来像这样:
[
{"movieId": 5870, "rating": 5},
{"movieId": 1234, "rating": 3},
"John Doe"
]从技术上讲,Java 允许你返回 List<Object>,并且 JSON 序列化库也能够将其转换为上述 JSON 字符串。然而,这种做法在 API 设计中是一个严重的反模式,主要有以下几个问题:
为了解决上述问题,最佳实践是将列表以及任何相关的全局信息封装在一个专用的数据传输对象(DTO,Data Transfer Object)中。这个 DTO 将作为 API 的顶级响应对象,提供一个清晰、强类型的契约。
例如,我们可以创建一个 RatedActor 类来封装用户姓名和其评分列表:
public class RatedActor {
private String name; // 用户的姓名
private List<Rating> ratings; // 该用户的评分列表
public RatedActor(String name, List<Rating> ratings) {
this.name = name;
this.ratings = ratings;
}
// ... getter/setter
}然后,API 可以返回这个 RatedActor 对象:
@GetMapping("/ratings-for-actor")
public RatedActor getRatingsForActor() {
List<Rating> userRatings = new ArrayList<>();
userRatings.add(new Rating(5870L, 5));
userRatings.add(new Rating(1234L, 3));
return new RatedActor("John Doe", userRatings);
}此时的 API 响应将是:
{
"name": "John Doe",
"ratings": [
{"movieId": 5870, "rating": 5},
{"movieId": 1234, "rating": 3}
]
}将 API 视为一个提供明确数据交换“契约”的接口至关重要。直接返回原始列表,尤其是包含混合数据类型的 List<Object>,会模糊这个契约,导致客户端难以理解、解析和维护。通过将列表和任何相关元数据封装在一个自定义的、强类型的数据传输对象(DTO)中,我们可以构建出更加健壮、可扩展、易于理解和使用的 API。这不仅是良好的编程实践,也是提升 API 质量和用户体验的关键一步。
以上就是API 设计最佳实践:为何应避免直接返回列表,尤其混合类型列表的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号