使用Spring Boot来实现GraphQL

GraphQL是什么?

我希望您能参考REST的挑战和GraphQL。

环境

    • Windows10

 

    • Java8

 

    • Spring Boot 2.2.1.RELEASE

 

    Maven 3.2.5

增加依赖库

我将添加以下内容。

    • GraphQL Java

 

    • GraphQL Spring Boot Starter

 

    GraphQL Java Tools
    <!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java -->
    <dependency>
      <groupId>com.graphql-java</groupId>
      <artifactId>graphql-java</artifactId>
      <version>11.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-spring-boot-starter -->
    <dependency>
      <groupId>com.graphql-java</groupId>
      <artifactId>graphql-spring-boot-starter</artifactId>
      <version>5.0.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java-tools -->
    <dependency>
      <groupId>com.graphql-java</groupId>
      <artifactId>graphql-java-tools</artifactId>
      <version>5.2.4</version>
    </dependency>

我们使用的版本是截至2019年12月的最新版本。

Schema(ス

希望您能够参考GraphQL的模式和类型定义来了解有关模式和类型的内容。

type Book {
    id: ID
    name: String
    pageCount: Int
    author: Author
}

type Author {
    id: ID
    firstName: String
    lastName: String
}

type Query {
    bookById(id: ID): Book
}

创建Type类

根据模式定义创建一个与定义的类型相应的Java类(用于保存从某种数据源获取的数据)。


public class Book {

    private String id;
    private String name;
    private int pageCount;
    private Author author;

    public void setId(String id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPageCount(int pageCount) {
        this.pageCount = pageCount;
    }

    public void setAuthor(Author author) {
        this.author = author;
    }
}
public class Author {

    private String id;
    private String firstName;
    private String lastName;

    public void setId(String id) {
        this.id = id;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

创建解析器(Resolver)

正如我们在GraphQL的模式和类型定义中提到的那样,我们可以在模式定义中定义客户端可以操作的查询和各种类型。但是,模式只是定义,不会执行实际的数据操作。实际的数据操作是由解析器来完成的。

@Component
public class BookResolver implements GraphQLQueryResolver {

    public Book bookById(String bookId) {
        // 実際は何らかのデータストアからデータを読み込み返却するケースがほとんどだが、ここではダミー値を返却
        Book book = new Book();
        book.setId(bookId);
        book.setName("bookName");
        book.setPageCount(900);
        Author author = new Author();
        author.setId("0001");
        author.setFirstName("fName");
        author.setLastName("lName");
        book.setAuthor(author);
        return book;
    }
}


执行

要执行GraphQL,可以使用GraphiQL和GraphQL Playground等工具,这些工具在介绍了GraphQL方便工具中提到过。本次使用的是GraphQL Playground的桌面版本。
*有关下载和安装,请参考GraphQL方便工具的说明。
启动Spring Boot后,打开安装的GraphQL Playground。选择“URL ENDPOINT”,输入http://localhost:8080/graphql并点击OPEN。在打开的界面上,写下以下查询,然后点击播放按钮进行执行。

query {
  bookById(id:1) {
    id
    name
  }
}

如果收到以下类似的回复,那就算是成功了。

{
  "data": {
    "bookById": {
      "id": "1",
      "name": "bookName"
    }
  }
}

让我们增加项目数量。现在,我们尝试编写以下查询,并点击播放按钮。

query {
  bookById(id:1) {
    id
    name
    author {
      id
      firstName
      lastName
    }
  }
}

只要能够得到如下所示的响应就算成功了。这样可以在不改变源代码的情况下动态地更改所需获取的项目。

{
  "data": {
    "bookById": {
      "id": "1",
      "name": "bookName",
      "author": {
        "id": "0001",
        "firstName": "fName",
        "lastName": "lName"
      }
    }
  }
}

就是这样了。

请参考

    • https://www.graphql-java.com/documentation/master/

 

    • https://www.graphql-java.com/tutorials/getting-started-with-spring-boot/

 

    • https://techblog.yahoo.co.jp/advent-calendar-2018/create-springbook-graphql-api/

 

    https://github.com/graphql-java-kickstart/graphql-spring-boot#enable-graphql-servlet
广告
将在 10 秒后关闭
bannerAds