GraphQL是一种用于API的查询语言和运行时环境,由Facebook于2012年开发并在2015年向公众发布。它提供了一种更高效、强大和灵活的方式来与Web服务进行通信,相比于传统的RESTful API,GraphQL具有更多的优势。
优点:
-
精确获取数据: GraphQL允许客户端精确地指定其所需的数据,避免了过度获取或不足的数据,提高了数据传输的效率。
-
单一端点: 与传统的RESTful API相比,GraphQL通常只暴露一个端点,使得客户端无需处理多个端点或版本控制,简化了API的维护和使用。
-
类型系统: GraphQL使用类型系统来定义API中的数据模型,提供了清晰的数据结构和类型,有助于开发人员理解和使用API。
-
关联数据获取: GraphQL支持在一个请求中获取多个相关联的数据,减少了网络往返次数,提高了数据获取的效率。
-
实时数据查询: GraphQL支持实时数据查询,例如通过WebSocket协议进行订阅,使得客户端可以即时获取数据更新。
-
强大的工具生态系统: GraphQL拥有丰富的工具生态系统,包括用于开发、测试和调试GraphQL API的各种工具和库,提高了开发效率和质量。
缺点:
-
学习曲线: 相对于传统的RESTful API,使用GraphQL可能需要更多的学习和理解,特别是对于新手来说,学习曲线可能较陡。
-
潜在的性能开销: 尽管GraphQL允许客户端精确地指定其所需的数据,但过于复杂的查询可能导致服务器负载增加和性能开销。
-
缓存难题: 由于GraphQL查询的灵活性,缓存数据变得更加复杂,因为同一个查询可能会请求不同的数据集合,这可能会增加缓存的复杂性和成本。
-
安全性问题: 如果不正确地实施,GraphQL可能会面临一些安全性问题,例如过度暴露敏感数据或遭受查询滥用。
-
无法完全替代REST: 尽管GraphQL在某些方面具有优势,但并不意味着它可以完全替代RESTful API。对于简单的数据获取场景,REST仍然可能是更合适的选择。
1、引用Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-graphql</artifactId>
<version>2.7.9</version>
</dependency>
2、YAML配置
spring:
graphql:
graphiql:
enabled: true
websocket:
path: /graphql
schema:
printer:
enabled: true
locations: classpath:schema #test.graphql文件位置
file-extensions: .graphql
3、test.graphql文件
#测试接口
#第一个graphql文件的type Mutation前不需要添加extend
type Mutation {
#新增测试
saveTest(testDto: TestDto):Boolean
}
#第一个graphql文件的type Query前不需要添加extend
type Query {
#获取列表测试
getTestList(name: String!):[TestVo]
}
#请求参数
input TestDto{
"""
ID
"""
id: Int!
"""
名称
"""
name: String!
"""
标题
"""
title: String
"""
备注
"""
remarks: String
}
#返回参数
type TestVo{
"""
ID
"""
id: Int
"""
名称
"""
name: String
"""
标题
"""
title: String
"""
备注
"""
remarks: String
}
4、Test测试实体类
/**
* @author Lucas
* date 2024/3/20 12:44
* description 测试
*/
@Data
public class Test {
/**
* ID
*/
private Integer id;
/**
* 名称
*/
private String name;
/**
* 标题
*/
private String title;
/**
* 备注
*/
private String remarks;
}
5、测试TestController接口调用
/**
* @author Lucas
* date 2024/3/20 12:40
* description 测试TestController
*/
@Slf4j
@RestController
public class TestController {
/**
* 新增测试
* @return true:成功; false:失败
*/
@MutationMapping
public Mono<Boolean> saveTest(@Argument Test test) {
log.info("新增测试,请求参数:{}", JSON.toJSONString(test));
return Mono.just(true);
}
/**
* 获取列表测试
* @param name
* @return
*/
@QueryMapping
public Mono<List<Test>> getTestList(@Argument String name) {
log.info("获取列表测试,请求参数:{}", name);
List<Test> tests = new ArrayList<>();
Test test1 = new Test();
test1.setId(1);
test1.setName("测试1");
test1.setTitle("标题1");
test1.setRemarks("备注1");
tests.add(test1);
Test test2 = new Test();
test2.setId(2);
test2.setName("测试2");
test2.setTitle("标题2");
test2.setRemarks("备注2");
tests.add(test2);
return Mono.just(tests);
}
}
6、测试结果