SpringBoot 整合 GraphQL替代 Restful

GraphQL 官网 https://graphql.cn/

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。

SpringBoot 集成

1. 在 pom.xml 引入依赖:

  <!-- 必需:包含了默认配置、graphql-java 和 graphql-java-tools,可以简化配置 -->
    <dependency>
      <groupId>com.graphql-java-kickstart</groupId>
      <artifactId>graphql-spring-boot-starter</artifactId>
      <version>11.0.0</version>
    </dependency>

    <!-- 可选:用于调试 GraphQL,功能类似 Restful 中的 Swagger -->
    <dependency>
      <groupId>com.graphql-java-kickstart</groupId>
      <artifactId>playground-spring-boot-starter</artifactId>
      <version>11.0.0</version>
    </dependency>

2. Application 配置

如果第1步没有引入playground-spring-boot-starter依赖,而是使用浏览器的 GraphQL Playground 插件调试 GraphQL,则还需要关闭跨域。如下 application.yml 文件:
参考 https://github.com/graphql-java-kickstart/graphql-spring-boot#enable-graphql-servlet

graphql:
  servlet:
    # 关闭跨域,仅使用浏览器插件调试时设置为false
    corsEnabled: false   
    playground:
      cdn:
        # playground 使用 cdn 的静态文件
        enabled: true    

3. 模拟查询

1. 首先定义实体对象

@Data
public class Question {

  private Long id;
  private String title;
  private String content;
  private Integer userId;
}

2. 由于主要是围绕 GraphQL 来做讲解的,这里假设查询的 Service 如下:

@Service
public class QuestionService {

  public Question selectById(long id) {
    Question question = new Question();
    question.setId(1L);
    question.setContent("how old are you?");
    question.setTitle("age");
    question.setUserId(140023);
    return question;

  }
}

3. 编写查询的 Resolver

定义一个 Resolver,实现 GraphQLQueryResolver 接口

@Component
public class Query implements GraphQLQueryResolver {
  @Autowired
  private QuestionService questionService;

  public Question getQuestionById(long id) {
    return questionService.selectById(id);
  }
}

4. 编写 schema.graphqls 注意后缀必须是 .graphqls

  • 为什么需要 schema ?
    • 每一个 GraphQL 服务都会定义一套类型,用以描述你可能从那个服务查询到的数据。每当查询到来,服务器就会根据 schema 验证并执行查询。
    • 通俗的讲就是你的查询能返回什么样的数据。
type Query {
    questionById(id: ID): Question
}

type Question {
    id: ID
    title: String
    content: String
    userId: Int
}

5. 启动测试

在浏览器地址栏中输入 http://localhost:8080/playground,输入以下查询命令:
就能看到返回的Json数据。

{
   questionById(id: 1) {
     id
     title
     content
     userId
   }
 }

查询结果:

{
  "data": {
    "questionById": {
      "id": "1",
      "title": "age",
      "content": "how old are you?"
    }
  }
}

Tips:
增加查询的数据和修改查询的字段,就能理解 schema 的用处了,前端输入的查询熟悉不在我们的规定范围内的话是不能进行查询的,schema 帮助我们约束了查询的条件和规范化。同时也定义了查结果的结构。

上一篇:apollo-android可以用作java客户端吗?


下一篇:javascript – 如何在React-Relay应用程序中进行文件上传?