
在 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
这样的 API 响应可能看起来像这样:
[ {"movieId": 5870, "rating": 5}, {"movieId": 1234, "rating": 3}, "John Doe"]
从技术上讲,Java 允许你返回 List
Riffusion
AI生成不同风格的音乐
87 查看详情
丧失类型契约与可预测性:当 API 返回 List
推荐的解决方案:封装在自定义对象中
为了解决上述问题,最佳实践是将列表以及任何相关的全局信息封装在一个专用的数据传输对象(DTO,Data Transfer Object)中。这个 DTO 将作为 API 的顶级响应对象,提供一个清晰、强类型的契约。
例如,我们可以创建一个 RatedActor 类来封装用户姓名和其评分列表:
public class RatedActor { private String name; // 用户的姓名 private List ratings; // 该用户的评分列表 public RatedActor(String name, List ratings) { this.name = name; this.ratings = ratings; } // ... getter/setter}
然后,API 可以返回这个 RatedActor 对象:
@GetMapping("/ratings-for-actor")public RatedActor getRatingsForActor() { List 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 契约: 消费者清楚地知道 API 返回一个 RatedActor 对象,其中包含一个 name 字段和一个 ratings 列表。强类型与易于解析: JSON 解析器可以直接将响应映射到 RatedActor 对象,无需手动解析或类型检查。这极大地简化了客户端代码。良好的可扩展性: 如果未来需要添加更多与用户相关的全局信息(如 userId、profilePictureUrl),只需在 RatedActor 类中添加新字段即可,而不会破坏现有结构或客户端解析逻辑。提高可读性和可维护性: 代码和 API 文档都更加清晰,新开发者能够更快地理解数据模型。符合面向对象原则: 这种方式更好地利用了面向对象语言的数据建模能力,将相关数据封装在一个有意义的单元中。
总结
将 API 视为一个提供明确数据交换“契约”的接口至关重要。直接返回原始列表,尤其是包含混合数据类型的 List
以上就是API 设计最佳实践:为何应避免直接返回列表,尤其混合类型列表的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1067588.html
微信扫一扫
支付宝扫一扫