spring-boot集成graphql入门教程

https://my.oschina.net/genghz/blog/1789240

本文介绍一个spring-boot + graphql, 是一个 graphql java 入门项目

graphql 到底是什么

    graphql 是一种 API 查询语言, 用于服务器端执行按已定义类型系统的查询. GraphQL 不与任何特定的数据库或存储引擎进行绑定, 而是由您的代码和数据支持.(官方描述)

    说白了 就是想要什么, 就传入什么字段, 也就会返回什么字段, 具体字段处理是服务器所提供, 而 graphql 并不会关心怎么服务器怎么处理

例如:

    传统的rest api:  /test/user/{id}  return { id, name, age } 是一成不变的,

    graphql:  findOneUser(id: xx)  return { id, name }  (注: 传输参数id, 指定返回字段 id, name, 当然也可以写{ name, age },完全取决于前端需求 )

graphql 的优势

    graphql 大大减少了沟通成本, 避免每次了定义api字段的多少问题, 前端自己选择、组合想要的字段, 生成数据, graphql 提供了GUI 可以很方便的测试, 书写graphql语句, 查看服务提供的 doc, 详细信息请看 https://graphql.cn/

项目构建

spring-boot 是基于 2.0.0版本, 想了解spring-boot https://gitee.com/geng_hz/Spring-Boot-Reference-Guide

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

大神们封装的 spring-boot 依赖

<!-- graphql -->
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-spring-boot-starter</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>com.graphql-java</groupId>
    <artifactId>graphql-java-tools</artifactId>
    <version>4.3.0</version>
</dependency>

项目的目录( 随便分的包最后会附上链接代码):

root.graphqls 是graphql 服务入口定义:

type Query {
    findAllAuthors: [Author]!
    countAuthors: Long!
    findOneAuthor(id: Long!): Author

    findAllBooks: [Book]!
    countBooks: Long!
}
type Mutation {
    newAuthor(firstName: String!, lastName: String!) : Author!

    newBook(title: String!, isbn: String!, pageCount: Int, authorId: Long!) : Book!
    saveBook(input: BookInput!): Book!
    deleteBook(id: ID!) : Boolean
    updateBookPageCount(pageCount: Int!, id: Long!) : Book!
}

scheme.graphqls 则是 query/mutation 具体的 scheme 定义字段、类型

type Author {
    id: Long!
    createdTime: String
    firstName: String
    lastName: String
    books: [Book]
}
input BookInput {
    title: String!
    isbn: String!
    pageCount: Int
    authorId: Long
}
type Book {
    id: Long!
    title: String!
    isbn: String!
    pageCount: Int
    author: Author
}

Query 是查询入口,  Mutation则是修改入口

例: findOneAuthor 传入一个long id, 返回一个 Author schema, 

graphql 入口定义了, 但这只是一个描述, 我们需要实现 query/mutation中的描述

例如:

public class Query implements GraphQLQueryResolver {
    private AuthorRepository authorRepository;
    private BookRepository bookRepository;

    public Author findOneAuthor(Long id) {
        Optional<Author> opt = authorRepository.findById(id);
        return opt.isPresent() ? opt.get() : null;
    }
    public List<Author> findAllAuthors() {
        return authorRepository.findAll();
    }
    public Long countAuthors() {
        return authorRepository.count();
    }
    public List<Book> findAllBooks() {
        return bookRepository.findAll();
    }
    public Long countBooks() {
        return bookRepository.count();
    }
}

实现了所有的 Query中的描述(必须全部实现)

schema 一样像我的目录中的一样 AuthorResolver 这是对schema中的描述的实现

注: query/mutation和普通的schema 一样, 只是它们是 graphql服务的入口, resolver实现描述遵循:

1. method <name>(*args)

2.method is<Name>(*args) 仅支持 return boolean

3.method get<Name>(*args)

4.method getField<Name>(*args)

这是种实现, 当提供了resolver时优先使用, 其次是 class this.get<Name>方法

Author.class 中的createdTime 是 Date, 然而 schema Author { createdTime: String }, 所以单独提供AuthorResovler 生成createdTime String, 而其他参数因为与schema Author类型一致,使用Author中的Get方法足够了

@Component
@AllArgsConstructor
public class AuthorResolver implements GraphQLResolver<Author> {

    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private BookRepository bookRepository;

    public String getCreatedTime(Author author) {
        return sdf.format(author.getCreatedTime());
    }
    public List<Book> getBooks(Author author) {
        return bookRepository.findByAuthorId(author.getId());
    }
}

执行脚本: ./run.sh 启动项目, graphql 的默认endpoint:  /graphql


graphql GUI, 方便的用来编写测试 graphql 和 查看当前服务提供了那些可用的方法, 像这样:

demo 代码、GUI奉上:

    https://gitee.com/geng_hz/spring-boot-graphql

java-graphql 还有一些其他的, 订阅/发布、校验、缓存等 只能去看文档了

希望大家一起学习, 交流

展开阅读全文

Graphql 服务器中集成prisma

04-18

<p>rn <strong><span style="font-size:14px;">GraphQL 是什么 ?</span></strong> rn</p>rn<p>rn GraphQL是Facebook开源的一种用于 API 的查询语言,并有可能成为未来的API规范<strong>。</strong> rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">哪些公司在使用GraphQL&nbsp; ?</span></strong> rn</p>rn<p>rn 越来越多主流的科技公司都开始拥抱GraphQL,比如facebook,twitter,Airbnb,github,reddit,Netflix,阿里,百度等等。rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">为什么使用Prisma ?</span></strong> rn</p>rn<p>rn prisma是一个超越ORM的数据库工具,它可以让你快速开发GraphQL API,让你免去了大部分的工作,开发GraphQL服务器从未如此简单。rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">我是否需要精通 后端语言 和 数据库 才能学习这门课程 ?</span></strong> rn</p>rn<p>rn 并不需要,甚至你可以在完全不懂任何后端语言和数据库的前提下掌握这门课程,并完成GraphQL服务器的开发。rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">我可以使用什么开发语言 ?</span></strong> rn</p>rn<p>rn Prisma 支持4种开发语言,分别是 javascript ( nodejs后端 ),TypeScript,flow,Go。未来还会支持更多的语言。rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">成为优秀全栈工程师的机遇 ?</span></strong> rn</p>rn<p>rn GraphQL并不复杂,通过学习本门课程你便可以开发GraphQL 后端服务器,并且学会在前端调用GraphQL API。rn</p>rn<p>rn 如果你是前端工程师,那么学习完本课程,你将能成为一名全栈开发者。rn</p>rn<p>rn 如果你是后端工程师,那么学习完本课程,再稍加学习些前端基础知识,便能成为全栈开发者。rn</p>rn<p>rn 如果你是 ios/安卓 工程师,那么学习完本课程,你便能成为移动端的全栈开发者。rn</p>rn<p>rn <span>如果你是网页/UI设计师,那么稍加学习javascript,再学习完本课程,你也能有机会成为全栈开发者。</span> rn</p>rn<p>rn <br />rn</p>rn<p>rn <strong><span style="font-size:14px;">开发GraphQL应用是否很难 ?</span></strong> rn</p>rn<p>rn 刚好相反,觉得难是因为你对它还不了解。实际上它很简单,很前沿,也很强大。rn</p>rn<p>rn <br />rn</p>rn<p>rn <img alt="" src="https://img-bss.csdn.net/201904170632564341.png" /> rn</p>rn<p>rn <img alt="" src="https://img-bss.csdn.net/201904170633112158.png" /> rn</p>rn<p>rn <img alt="" src="https://img-bss.csdn.net/201904170633325916.png" /> rn</p>rn<p>rn <img alt="" src="https://img-bss.csdn.net/201904170633504420.png" /> rn</p>rn<p>rn <img alt="" src="https://img-bss.csdn.net/201904170634041709.png" /> rn</p>

没有更多推荐了,返回首页