GraphQL 学习笔记
一 GraphQL 是什么
官网点我
看官网怎么说?
二 我们用它做什么
公司有个需求:根据多组API数据源,集成为一条结果集。输出给前端进行展示出来。
基于这样的需求背景。我们考虑了使用RESTFul的方式,请求多个API ,然后再进行数据组装。但同时,也发现了GraphQL这个工具语言。它的特点有:请求你所要的数据不多不少;获取多个资源,只用一个请求;描述所有的可能,类型系统。
三 来试试怎么用
这里我们以Springboot 集成GraphQL的方式实现
3.1 新建Spring boot项目。引入依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>3.10.0</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java</artifactId> <version>2019-10-31T04-37-48-0919e71</version> </dependency> <!-- 图形化界面graphiql-spring-boot-starter --> <dependency> <groupId>com.graphql-java-kickstart</groupId> <artifactId>graphiql-spring-boot-starter</artifactId> <version>5.10.0</version> </dependency> <dependency> <groupId>com.graphql-java</groupId> <artifactId>graphql-java-tools</artifactId> <version>5.2.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.4</version> </dependency> </dependencies>
3.2 创建解析器
注意:这里解析器的方法名和输入参数,要和你定义在schema.graphqls里的方法类型和参数名相同。
@Component @AllArgsConstructor @Slf4j public class BookQueryResolver implements GraphQLQueryResolver { private static final String URL= "http://localhost:8080/getData"; /** * 这里传入外部API的请求路径,根据id从外部API获取数据源 * 填充数据 * @return */ public Book findBooks(String id){ return HttpClintUtil.doGet(URL, id); } }
3.3 创建schema.graphqls文件,编写schmea文件
编写语法指南: https://www.prisma.io/blog/graphql-sdl-schema-definition-language-6755bcb9ce51
前端语法速查表: http://caibaojian.com/scb/graphql.html
解释:
Query 表示为查询
方法的入参要对应字段名和字段类型。
返回类型也要按照类型对应
type Query {
findBooks(id: String!): Book
}
type Book {
id: String
name: String
pageCount: String
authorId: String
}
3.4 controller调用
@RestController public class BookController { @Autowired BookQueryResolver bookQueryResolver; @GetMapping("getData") public Book findBooks(@RequestParam("id") String id){ return bookQueryResolver.findBooks(id); } }
3.5 测试