java 为什么最好避免在API中返回列表?

5cnsuln7  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(138)

我的问题是关于在API中返回列表。假设我们有一个API返回Rating的列表。
这是Rating

public class Rating {

    private Long movieId;
    private Integer rating;
    .
    .
}

下面是API响应的示例:

[{"movieId":5870,"rating":5},{"movieId":1234,"rating":3}]

好的。现在我想在我的API中有一个增强,并且这个增强不是针对列表中的特定对象。例如,我想添加一个字段来指示这些Rating属于谁。
但在this教程中,讲师说:
我们无法再返回列表。我们必须将其转换为对象。
为什么我们不能再返回一个列表?我们可以有一个API响应,如下所示:

[{"movieId":5870,"rating":5},{"movieId":1234,"rating":3},"John Doe"]

它的代码是:

@GetMapping("-sth-")
    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有什么问题吗?是因为我们返回了Object的列表吗?

guicsvcw

guicsvcw1#

医生:这是很好的练习。
如果你把API看作是一个契约,我给予你这个信息,你给我这个信息,一旦你返回一个List<Object>,你就再也没有任何方法来推理这个列表中有什么,以及你应该用它做什么。
如果列表中没有“John Doe”,您可以告诉JSON解析器将您的响应转换为List<Rating>,而无需进一步的帮助。但是,添加“John Doe”会阻止它这样做,您所能希望的最好结果是List<Object>。因此,现在您需要手动确定John Doe在列表中的位置,他是否在第一位,等等。
您可能需要编写一个自定义解析器,或者确保使用此API的每个人都知道John Doe可能(也可能不?)出现在最后一个位置,(或者第一个,或者中间的任何位置?)坦率地说,作为开发人员,重构为使用自定义Object更容易,这样您就可以告诉JSON库将响应解析为RatedActor类型的Object:

public class RatedActor {
    String name;
    List<Rating> ratings;
}

这就是面向对象语言的用途(以及其他用途)--能够提供细粒度的数据模型。现在,您、编译器以及其他所有可能接触到您的API和/或代码的人都清楚地知道:API返回具有这些属性的RatedActor。秘密列表中没有嵌入“隐藏的知识”。否则,您还不如用Enigma机器扰乱API响应,然后说“嘿,API消费者,搞清楚这一点!”

v8wbuo2f

v8wbuo2f2#

它更多的是关于最佳实践,因为使用JSON对象更能适应未来的变化。(它不是集合的一部分,但在结果中是必需的,如状态代码)。返回JSON对象使程序更灵活。如果需要,也可以返回JSON列表。没有技术问题。2返回JSON对象还可以帮助你发送状态代码和描述,如(SUCCESS 500,ERROR 404),这与JSON数组不同,JSON数组不会给予结果的描述。

相关问题