项目准备

开发环境

  • Windows10
  • Java 11(采用OpenJDK jdk11.0.4+11 OpenJ9 0.15.1)
  • Maven 3.5.4
  • STS 4.4.0

创建一个基本Spring Boot项目

  • Spring Boot 2.1.9

添加GraphQL Java依赖项

使用 graphql-java-kickstart / graphql-spring-boot 。要执行的最小依赖项仅如下所示。

<dependency><groupId>com.graphql-java-kickstart</groupId><artifactId>graphql-spring-boot-starter</artifactId><version>5.10.0</version>
</dependency>

还需要将kotlin的版本指定为属性(如果没有描述,则在运行时会发生异常)。

<properties><java.version>11</java.version><kotlin.version>1.3.10</kotlin.version>
</properties>

API第1部分:支持简单的get查询

考虑为以下模型获取ID的一个实体。

Member ( member ID , name, age)

GraphQL定义创建

src/main/resources/graphql 创建一个描述类型定义和查询定义的文件,如下所示。

type Member {memberId: ID!name: String!age: Int
}type Query {getMember(memberId:ID!): Member
}

Java端实现

实体类

首先,创建一个与类型定义匹配的实体类。

@Data
public class Member {private String memberId;private String name;private Integer age;
}

查询

接下来,创建与查询对应的方法。 GraphQLQueryResolver 创建一个实现类,并创建一个与查询名称同名的方法。定义一个也与参数和返回值相对应的类,并实现实际返回的实例。创建返回值的方法是任意的(使用MyBatis映射器(省略))。用所有值填写返回值字段​​可以作为Servlet返回。

@Component
public class MemberQueryResolver implements GraphQLQueryResolver {@AutowiredMemberMapper mapper;public Member getMember(String memberId) {return mapper.getById(memberId);}
}

执行

启动配置

在 application.yml 中描述Servlet的启动配置。

graphql:servlet:enabled: truemapping: /graphqlcorsEnabled: true

启动

写入后,将创建的项目作为Spring Boot App执行。

查询发布

http://localhost:8080/graphqlIf queryyou设置GraphQL查询作为URL参数的值并访问它,将获得结果。

例如,在发出以下查询时

query {getMember(memberId:"aaaaaaaa") {name}
}

除了新行和不必要的空白编码,然后查询 %7BgetMember(memberId:%22aaaaaaaa%22)%7Bname%7D%7Dto 以签入,因为curl。

$ curl -s "http://localhost:8080/graphql?query=query%7BgetMember(memberId:%22aaaaaaaa%22)%7Bname%7D%7D"
{"data":{"getMember":{"name":"齊藤京子"}}}

如果更改 memberId 并将年龄添加到采集密钥中,将得到以下结果。

$ curl -s "http://localhost:8080/graphql?query=query%7BgetMember(memberId:%22bbbbbbbb%22)%7Bname,age%7D%7D"
{"data":{"getMember":{"name":"佐々木久美","age":23}}}

引入Graph i QL

encodeuris由于使用curl或浏览器访问每个查询太麻烦,我们将引入一个工具来尝试查询。这次我们将使用图i QL。

添加依赖项

graph“i”将 ql-spring-boot-starter 程序添加到依赖项中。

<dependency><groupId>com.graphql-java-kickstart</groupId><artifactId>graphiql-spring-boot-starter</artifactId><version>5.10.0</version>
</dependency>

execution

启动配置

在 application.yml 中描述Servlet的启动配置。目前,如果您有以下设置,请启动它。

graphiql:enabled: truemapping: /graphiqlendpoint:graphql: /graphql

启动

写入后,将创建的项目作为Spring Boot App执行。通道

当服务器启动时从浏览器启动 http://localhost:8080/graphiql .

在左侧的查询创建屏幕上,字段名有一个输入帮助,执行结果的json也以格式化的形式显示。

API#2:尝试嵌套类型

除了第1部分中的模型之外,还可以考虑通过关系来获取一个实体的模型,该模型通过关系将以下多对多模型连接起来。

Member ( member ID , name, age)Music ( song ID , song name)Participating song relation ( song ID , member ID )

GraphQL定义修改

添加到定义文件中。由于它是多对多成员,因此它可以同时使用 Musicis Musican Memberarray 。

type Member {memberId: ID!name: String!age: Intjoining: [Music]
}type Music {musicId: ID!title: String!members: [Member]
}type Query {getMember(memberId:ID!): MembergetMusic(musicId:ID!):Music
}

Java端实现

实体类

创建与新类型定义相对应的实体类。将属性定义为数组列表。

@Data
public class Music {private String musicId;private String title;private List<Member> members;
}

members现在已添加属性,请添加一个字段。

@Data
public class Member {private String memberId;private String name;private int age;private List<Music> joining;
}

查询

MemberQueryResolverIs 保持不变。 Member.joining 创建在另一个类中插入值的逻辑。

在 DataClass(<>inside) 中, GraphQlResolver 创建一个指定插入目标实体类的实现类,并创建一个与插入目标字段同名的方法。在参数中指定插入目标的实体类,并返回要插入的实例。

( MusicMapper.getMusicsOfMember 是一种通过关系获取与 memberId 关联的所有音乐的方法(省略实现内容)

@Component
public class MemberResolver implements GraphQLResolver<Member> {@AutowiredMusicMapper mapper;public List<Music> joining(Member member) {return mapper.getMusicsOfMember(member.getMemberId());}
}

execution

当您发出以下查询时

query {getMember(memberId:"cccccccc") {name, age, joining {title}}
}

将会返回下面的数据:

{"data": {"getMember": {"name": "富田鈴花","age": 18,"joining": [{"title": "こんなに好きになっちゃっていいの?"},{"title": "ホントの時間"},{"title": "まさか 偶然…"},{"title": "川は流れる"}]}}
}

在STS的调试模式下进行检查时,您可以看到搜索结果插入到字段中而非的实例作为 MemberResolver.joining 传递参数 joining 。

此外,joining如果未在查询中指定,或者如果指定的 memberId 不存在且结果为 null ,则不会执行此方法。

API#3:尝试创建注册函数

到目前为止,我们只处理了查询(对应于CRUD中的R)。接下来,尝试实现变异(对应于CRUD C/U/D)。

添加了GraphQL定义

添加到定义文件中。

type Mutation {registerMusic(title: String!): Music
}

Java端实现

因为这里创建的是一个与现有实体相对应的实体。 GraphQlmutationResolver 创建一个实现类,并创建一个带有参数和返回值的方法​​与GraphQL类似的查询。

( GenerateId() 是一个生成成为ID的字符串的方法, MusicMapper.insert 是一个插入所有参数信息的方法。(省略实现内容))

@Component
public class MusicMutationResolver implements GraphQLMutationResolver {@AutowiredMusicMapper mapper;public Music registerMusic(String title) {Music music = new Music();music.setMusicId(generateId());music.setTitle(title);mapper.insert(music);return music;}
}

查询发布

如果发生突变,则使用后调用API。查询作为JSON格式参数附加。

*“在查询中转义

$ curl -s "http://localhost:8080/graphql" -X POST -H "Content-Type: application/json" -d '{"query":"mutation{registerMusic(title:\"NO WAR in the future\"){musicId,title}}"}'
{"data":{"registerMusic":{"musicId":"hogehoge","title":"NO WAR in the future"}}}

Graph i QL

在尝试使用Graph i QL时,在左侧 mutation{…} ,并在其中写入API名称、参数和输出内容,就像在查询中一样。

使用Spring Boot实现GraphQL相关推荐

  1. 使用Spring Boot和GraphQL构建安全的API

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Grap ...

  2. Netflix 开源用于 Spring Boot的 GraphQL 服务框架DGS

    作者 | Netflix 技术博客,策划 | 田晓旭 文章来源:架构头条 Netflix 公司着力开发的 Domain Graph Service(DGS)框架现已正式成为开源项目.DGS 框架简化了 ...

  3. Spring Boot 的 GraphQL 框架DGS

    DGS Framework Netflix 开发的 GraphQL 服务器框架 Domain Graph Service(DGS)框架的源代码 ,该框架是为独立和联合 GraphQL 服务开发的内容流 ...

  4. 在15分钟内使用Spring Boot和Spring Security构建一个Web应用程序

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 开发人员 ...

  5. 使用PostgreSQL使用Spring Boot和JPA构建基本应用

    "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 每个不平 ...

  6. Spring Boot + GraphQL 才是 API 的未来!

    前言 在浅尝GraphQL一文描述了GraphQL及基本使用,本文提供一个基本示例,描述如何基于spring boot的web项目快速应用. graphql-java的官方文档:Getting sta ...

  7. 一种灵活的API设计模式:在Spring Boot中支持GraphQL

    导读:GraphQL是一种基于api的查询语言,它提供了一种更高效.强大和灵活的数据提供方式.它是由Facebook开发和开源,目前由来自世界各地的大公司和个人维护.本文作者先介绍了GraphQL,随 ...

  8. 40 个 Spring Boot 常用注解

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者 | 谭朝红 链接 | ramostear.com 一.Spring Web MVC 与 Spring Bean 注解 Sp ...

  9. Spring Boot 集成 Swagger 生成 RESTful API 文档

    原文链接: Spring Boot 集成 Swagger 生成 RESTful API 文档 简介 Swagger 官网是这么描述它的:The Best APIs are Built with Swa ...

最新文章

  1. 你不可不知的9种Lisp语言思想
  2. mysql 5.5 5.6 主从_mysql5.6+主从集的版本号(mysql5.5主机和从机载带后,5.5在设置有一定的差距)...
  3. python中自带的三个装饰器
  4. Python---多任务介绍以及Thread的基本使用
  5. javascript 实现快排 ,三向切分快排
  6. java自定义外部接口_如何使用可外部化的接口在Java中自定义序列化
  7. php中的list()用法中要注意的地方
  8. 引领性指标与滞后性指标_测量可用性组同步滞后
  9. php中的require(),PHP中include()与require()的区别说明
  10. BERT模型—6.对抗训练原理与代码实现
  11. java组件名词解释_简述Java EE三类组件的构成及运行环境。
  12. 在WPF里面实现以鼠标位置为中心缩放移动图片
  13. C语言—黑客数字雨特效
  14. 小米生态链成功的12个关键因素
  15. Graph Convolutional Tracking
  16. 傅里叶级数到傅里叶变换
  17. JavaWebJavaEE重要基础知识
  18. TIA博途中触摸屏仿真时画面字体变大,超出范围的处理方法
  19. 华红兵:移动互联网时代,场景理论的四大特征
  20. 2020-319 几种分类器评估与调优方法手写整理 37互娱笔试题

热门文章

  1. 表示自己从头开始的句子_表达重新开始的励志句子 从头开始的励志说说
  2. 【半精度】Pytorch模型加速和减少显存
  3. 读《穷爸爸富爸爸》有感
  4. 在线学习网站大全(推荐)
  5. 微信开发——开放标签
  6. android通讯录实例(一)
  7. 问渠哪得清如许,为有源头活水来之TCP / UDP
  8. zookeeper Unable to read additional data from server sessionid 0x0
  9. addb %al,%al
  10. IP-GUARD如何禁止除了银行UKEY设备外的其他USB设备?