前言Netflix 已开放其 Domain Graph Service(DGS)框架的源代码 ,该框架是为了方便整合 GraphQL 使用,用于简化 GraphQL 的实现 。
GraphQL 主要是作用于数据接口,比如前端后端交互 。无需定义或修改后台 Controller、Service 等业务代码即可实现灵活的数据变更,客户端可以自由获取服务端事先定义好的数据,提高了交互接口的灵活性
组件依赖
graphql-dgs-spring-boot-starter
<dependency><groupId>com.netflix.graphql.dgs</groupId><artifactId>graphql-dgs-spring-boot-starter</artifactId><version>3.5.1</version></dependency>
DGS 必须从 jcenter 下载,不然部分依赖者无法下载 。踩坑很久【火爆外网的 DGS 框架使用,更方便 GraphQL 的使用】
<profiles><profile><activation><activeByDefault>true</activeByDefault></activation><repositories><repository><snapshots><enabled>false</enabled></snapshots><id>central</id><name>bintray</name><url>https://jcenter.bintray.com</url></repository></repositories><pluginRepositories><pluginRepository><snapshots><enabled>false</enabled></snapshots><id>central</id><name>bintray-plugins</name><url>https://jcenter.bintray.com</url></pluginRepository></pluginRepositories><id>bintray</id></profile></profiles>
定义接口 schema/src/main/resources/schema/schema.graphqls此文件定义了客户端请求入参格式和查询数据类型
type Query {shows(title: String ,releaseYear: Int): [Show]}type Show {title: StringreleaseYear: Int}
定义数据抽取规则@DgsComponentpublic class ShowsDatafetcher {@DgsData(parentType = "Query", field = "shows")public List<Show> shows(@InputArgument("title") String title, @InputArgument("releaseYear") Integer releaseYear) {if (title == null) {return shows;}return shows.stream().filter(s -> s.getTitle().contains(title)).collect(Collectors.toList());}// 模拟 DB 查询private final List<Show> shows = List.of(new Show("JAVA", 1995),new Show("php", 1995),new Show("Python", 1990),new Show("golang", 2009),new Show("rust", 2015));}
UI 前端调试访问:
http://localhost:8080/graphiql
文章插图
条件查询
文章插图
接口调用
curl --location --request POST 'http://localhost:8080/graphql' --header 'Content-Type: Application/json' --data-raw '{"query":"{nshows(title: "java", releaseYear: 1995) {ntitlenreleaseYearn}n}n","variables":null}'
java 调用@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class})class ShowsDatafetcherTests {@AutowiredDgsQueryExecutor dgsQueryExecutor;@Testvoid shows() {List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath(" { shows { title releaseYear }}","data.shows[*].title");assertThat(titles).contains("java");}}
推荐阅读
- Linux:文件解压、复制和移动的若干坑
- 红茶冲泡方法多少度,红茶用多少度的水泡好
- 红茶姜加蜂蜜的功效,泡的红茶可以加蜂蜜吗
- 红茶喝几泡,红茶干茶的色泽
- 红茶盖碗泡法视频,袋装红茶泡多久
- 阅读率高达10W+的“神”标题是怎样炼成的?
- 红茶的香味怎么样保存,红茶的泡多长时间
- 了解路由器的寻址转发,学习默认路由、静态路由的配置部署
- 吕方咋死的?
- 25 张图详解交换机:秒懂二层交换机的 16 个问题