Spring Boot项目集成GraphQL

本文介绍了GraphQL,一种强大的API查询语言,它提供了精确数据获取、单一端点、类型系统等优势,同时探讨了其学习曲线、性能影响和安全挑战。文章还展示了如何在SpringBoot中集成和配置GraphQL。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GraphQL是一种用于API的查询语言和运行时环境,由Facebook于2012年开发并在2015年向公众发布。它提供了一种更高效、强大和灵活的方式来与Web服务进行通信,相比于传统的RESTful API,GraphQL具有更多的优势。

优点:

  1. 精确获取数据: GraphQL允许客户端精确地指定其所需的数据,避免了过度获取或不足的数据,提高了数据传输的效率。

  2. 单一端点: 与传统的RESTful API相比,GraphQL通常只暴露一个端点,使得客户端无需处理多个端点或版本控制,简化了API的维护和使用。

  3. 类型系统: GraphQL使用类型系统来定义API中的数据模型,提供了清晰的数据结构和类型,有助于开发人员理解和使用API。

  4. 关联数据获取: GraphQL支持在一个请求中获取多个相关联的数据,减少了网络往返次数,提高了数据获取的效率。

  5. 实时数据查询: GraphQL支持实时数据查询,例如通过WebSocket协议进行订阅,使得客户端可以即时获取数据更新。

  6. 强大的工具生态系统: GraphQL拥有丰富的工具生态系统,包括用于开发、测试和调试GraphQL API的各种工具和库,提高了开发效率和质量。

缺点:

  1. 学习曲线: 相对于传统的RESTful API,使用GraphQL可能需要更多的学习和理解,特别是对于新手来说,学习曲线可能较陡。

  2. 潜在的性能开销: 尽管GraphQL允许客户端精确地指定其所需的数据,但过于复杂的查询可能导致服务器负载增加和性能开销。

  3. 缓存难题: 由于GraphQL查询的灵活性,缓存数据变得更加复杂,因为同一个查询可能会请求不同的数据集合,这可能会增加缓存的复杂性和成本。

  4. 安全性问题: 如果不正确地实施,GraphQL可能会面临一些安全性问题,例如过度暴露敏感数据或遭受查询滥用。

  5. 无法完全替代REST: 尽管GraphQL在某些方面具有优势,但并不意味着它可以完全替代RESTful API。对于简单的数据获取场景,REST仍然可能是更合适的选择。

1、引用Maven依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-graphql</artifactId>
    <version>2.7.9</version>
</dependency>

2、YAML配置

spring:
  graphql:
    graphiql:
      enabled: true
    websocket:
      path: /graphql
    schema:
      printer:
        enabled: true
      locations: classpath:schema   #test.graphql文件位置
      file-extensions: .graphql

3、test.graphql文件

#测试接口
#第一个graphql文件的type Mutation前不需要添加extend
type Mutation {
    #新增测试
    saveTest(testDto: TestDto):Boolean
}

#第一个graphql文件的type Query前不需要添加extend
type Query {
    #获取列表测试
    getTestList(name: String!):[TestVo]
}

#请求参数
input TestDto{
    """
    ID
    """
    id: Int!
    """
    名称
    """
    name: String!
    """
    标题
    """
    title: String
    """
    备注
    """
    remarks: String
}

#返回参数
type TestVo{
    """
    ID
    """
    id: Int
    """
    名称
    """
    name: String
    """
    标题
    """
    title: String
    """
    备注
    """
    remarks: String
}

4、Test测试实体类

/**
 * @author Lucas
 * date 2024/3/20 12:44
 * description 测试
 */
@Data
public class Test {
    /**
     * ID
     */
    private Integer id;
    /**
     * 名称
     */
    private String name;
    /**
     * 标题
     */
    private String title;
    /**
     * 备注
     */
    private String remarks;
}

5、测试TestController接口调用

/**
 * @author Lucas
 * date 2024/3/20 12:40
 * description 测试TestController
 */
@Slf4j
@RestController
public class TestController {

    /**
     * 新增测试
     * @return true:成功; false:失败
     */
    @MutationMapping
    public Mono<Boolean> saveTest(@Argument Test test) {
        log.info("新增测试,请求参数:{}", JSON.toJSONString(test));
        return Mono.just(true);
    }

    /**
     * 获取列表测试
     * @param name
     * @return
     */
    @QueryMapping
    public Mono<List<Test>> getTestList(@Argument String name) {
        log.info("获取列表测试,请求参数:{}", name);
        List<Test> tests = new ArrayList<>();
        Test test1 = new Test();
        test1.setId(1);
        test1.setName("测试1");
        test1.setTitle("标题1");
        test1.setRemarks("备注1");
        tests.add(test1);
        Test test2 = new Test();
        test2.setId(2);
        test2.setName("测试2");
        test2.setTitle("标题2");
        test2.setRemarks("备注2");
        tests.add(test2);
        return Mono.just(tests);
    }
}

6、测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值