GraphQL vs REST在Java中:2025年后端该如何选择?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

GraphQL vs REST在Java中:后端领域的巅峰对决

\n\n

想象一下,你正在点一份披萨。REST就像他们给你送来一整张披萨,即使你只想要一片意大利辣香肠。而GraphQL则是你说:“请只给我意大利辣香肠和奶酪,面团和番茄酱你们自己留着吧。”听起来很方便,对吧?这正是近年来Java开发领域主要争论的核心原则。

\n\n

REST和GraphQL是构建API的两种强大方法,每个Java开发者迟早都会面临选择。 在Java项目中比较GraphQL vs REST 不仅仅是技术争论,而是一个实际问题,它关系到性能、开发速度和维护便利性。让我们通过实际示例和真实代码来深入探讨。

\n\n

REST:老朋友,是否胜过新欢?

\n\n

REST(表述性状态传递)是一种架构风格,在Java世界中占据主导地位已超过十年。 Java的RESTful服务 建立在简单的原则之上:资源、HTTP方法(GET、POST、PUT、DELETE)和状态码。一切都很熟悉、可预测且稳定。

\n\n

Spring Boot上的REST控制器示例

\n\n
@RestController\n@RequestMapping("/api/users")\npublic class UserController {\n\n    @Autowired\n    private UserService userService;\n\n    @GetMapping("/{id}")\n    public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {\n        UserDTO user = userService.findById(id);\n        return ResponseEntity.ok(user);\n    }\n\n    @GetMapping\n    public ResponseEntity<List<UserDTO>> getAllUsers() {\n        List<UserDTO> users = userService.findAll();\n        return ResponseEntity.ok(users);\n    }\n}
\n\n

一切干净、优雅,符合规范。 Java的REST API 运行如钟表,只要您的客户端(浏览器和移动应用)知道它们需要哪些数据。但有一个问题:REST经常遭受 过度获取(数据冗余)和 欠获取(数据不足)的困扰。

\n\n

假设一个移动应用只需要用户名和电子邮件。REST请求 GET /api/users/1 将返回完整的UserDTO对象,包含所有字段,包括地址、电话、订单历史。额外的流量,额外的负载。熟悉吗?

\n\n

GraphQL:雄心勃勃的新秀

\n\n

GraphQL是一种查询语言,由Facebook(现Meta)于2012年开发。 GraphQL Java 是Java生态系统的规范实现。与REST不同,GraphQL只有一个入口点(通常是/graphql),客户端自己决定需要哪些字段。

\n\n

使用graphql-java和Spring Boot的GraphQL Java模式示例

\n\n
// 模式定义(在schema.graphqls文件中)\ntype Query {\n    user(id: ID!): User\n    users: [User]\n}\n\ntype User {\n    id: ID!\n    name: String!\n    email: String!\n    address: String\n    phone: String\n}\n\n// GraphQL控制器(Spring Boot + graphql-java-spring-boot-starter)\n@Component\npublic class UserGraphQLQuery implements GraphQLQueryResolver {\n\n    @Autowired\n    private UserService userService;\n\n    public User user(Long id) {\n        return userService.findById(id);\n    }\n\n    public List<User> users() {\n        return userService.findAll();\n    }\n}
\n\n

现在客户端可以发送这样的请求:

\n\n
{\n  user(id: 1) {\n    name\n    email\n  }\n}
\n\n

并且只会得到它请求的内容:{ "data": { "user": { "name": "伊万", "email": "ivan@example.com" } } }。没有任何多余的数据。 GraphQL与REST的比较 在这方面显然前者更胜一筹。

\n\n

REST何时胜出:Java项目的适用场景

\n\n

尽管GraphQL充满魔力,但在某些场景下REST仍然是王者。 Java的RESTful服务 在以下情况下是理想选择:

\n\n
    \n
  • 简单性和透明性

博客

书籍推荐