zoukankan      html  css  js  c++  java
  • 火爆*的 DGS 框架使用

    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 下载,不然部分依赖无法下载。踩坑很久
    	<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: String
        releaseYear: Int
    }
    

    定义数据抽取规则

    @DgsComponent
    public 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 前端调试

    • 条件查询

    接口调用

    curl --location --request POST 'http://localhost:8080/graphql' 
    --header 'Content-Type: application/json' 
    --data-raw '{"query":"{
      shows(title: "java", releaseYear: 1995) {
        title
        releaseYear
      }
    }
    ","variables":null}'
    

    java 调用

    @SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class})
    class ShowsDatafetcherTests {
    
    	@Autowired
    	DgsQueryExecutor dgsQueryExecutor;
    
    	@Test
    	void shows() {
    		List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath(
    				" { shows { title releaseYear }}",
    				"data.shows[*].title");
    		assertThat(titles).contains("java");
    	}
    }
    
    

    本节源码

    源码: https://github.com/lltx/dgs-demo
    DGS 官网: https://netflix.github.io/dgs
    >>> 源码 https://gitee.com/log4j/pig,欢迎署名转载 <<<

    本篇文章由一文多发平台ArtiPub自动发布

  • 相关阅读:
    什么是内部类
    "=="和equals方法究竟有什么区别?
    SWFUpload乱码问题的解决
    xStream转换XML、JSON
    Java文件下载
    笔记摘录
    Javascript 函数传参问题
    JQUERY伸缩导航
    ruby关于flip-flop理解上一个注意点
    ruby 使用Struct场景
  • 原文地址:https://www.cnblogs.com/leng-leng/p/14464803.html
Copyright © 2011-2022 走看看