首页 > 其他分享 >使用Spring Boot和GraphQL构建灵活的API服务

使用Spring Boot和GraphQL构建灵活的API服务

时间:2024-07-17 13:51:11浏览次数:13  
标签:String Spring Boot id API GraphQL import public

使用Spring Boot和GraphQL构建灵活的API服务

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

一、引言

在现代Web应用中,API服务是前后端数据交互的桥梁。传统的RESTful API虽然强大,但在复杂查询场景中显得有些笨重。GraphQL作为一种新型API查询语言,提供了更灵活和高效的查询方式。本文将详细介绍如何使用Spring Boot和GraphQL构建灵活的API服务。

二、环境搭建

首先,创建一个新的Spring Boot项目,并添加必要的依赖。我们将使用GraphQL Java和Spring Boot Starter GraphQL来实现GraphQL API。

  1. 添加Maven依赖

pom.xml中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-spring-boot-starter</artifactId>
        <version>11.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphiql-spring-boot-starter</artifactId>
        <version>11.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.graphql-java-kickstart</groupId>
        <artifactId>graphql-java-tools</artifactId>
        <version>11.1.0</version>
    </dependency>
</dependencies>

三、定义GraphQL Schema

GraphQL Schema定义了API的查询和类型。我们在src/main/resources目录下创建一个schema.graphqls文件。

type Query {
    getBookById(id: ID!): Book
    getAllBooks: [Book]
}

type Book {
    id: ID!
    title: String
    author: String
    publishedDate: String
}

四、创建实体类

cn.juwatech.model包下创建一个Book类。

package cn.juwatech.model;

public class Book {
    private String id;
    private String title;
    private String author;
    private String publishedDate;

    // Getters and Setters
    public String getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        return author;
    }

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

    public String getPublishedDate() {
        return publishedDate;
    }

    public void setPublishedDate(String publishedDate) {
        this.publishedDate = publishedDate;
    }
}

五、数据存储

cn.juwatech.repository包下创建一个简单的BookRepository类来模拟数据存储。

package cn.juwatech.repository;

import cn.juwatech.model.Book;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Repository
public class BookRepository {
    private List<Book> books = new ArrayList<>();

    public BookRepository() {
        books.add(new Book("1", "Spring Boot in Action", "Craig Walls", "2016"));
        books.add(new Book("2", "GraphQL in Action", "Samer Buna", "2021"));
    }

    public List<Book> getAllBooks() {
        return books;
    }

    public Optional<Book> getBookById(String id) {
        return books.stream().filter(book -> book.getId().equals(id)).findFirst();
    }
}

六、创建GraphQL查询

cn.juwatech.resolver包下创建一个BookQuery类。

package cn.juwatech.resolver;

import cn.juwatech.model.Book;
import cn.juwatech.repository.BookRepository;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class BookQuery implements GraphQLQueryResolver {

    @Autowired
    private BookRepository bookRepository;

    public Book getBookById(String id) {
        return bookRepository.getBookById(id).orElse(null);
    }

    public List<Book> getAllBooks() {
        return bookRepository.getAllBooks();
    }
}

七、启动应用并测试

通过运行Spring Boot应用程序,我们可以启动GraphQL API服务。访问http://localhost:8080/graphiql,可以使用GraphiQL工具来测试我们的API。

查询示例

获取所有书籍:

query {
  getAllBooks {
    id
    title
    author
    publishedDate
  }
}

根据ID获取书籍:

query {
  getBookById(id: "1") {
    id
    title
    author
    publishedDate
  }
}

八、处理复杂查询

GraphQL允许我们处理复杂查询。例如,我们可以添加一个新字段来查询作者的书籍。

  1. 更新Schema

schema.graphqls中添加新字段:

type Query {
    getBookById(id: ID!): Book
    getAllBooks: [Book]
    getBooksByAuthor(author: String!): [Book]
}
  1. 更新Resolver

BookQuery中添加新方法:

package cn.juwatech.resolver;

import cn.juwatech.model.Book;
import cn.juwatech.repository.BookRepository;
import com.coxautodev.graphql.tools.GraphQLQueryResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
public class BookQuery implements GraphQLQueryResolver {

    @Autowired
    private BookRepository bookRepository;

    public Book getBookById(String id) {
        return bookRepository.getBookById(id).orElse(null);
    }

    public List<Book> getAllBooks() {
        return bookRepository.getAllBooks();
    }

    public List<Book> getBooksByAuthor(String author) {
        return bookRepository.getAllBooks().stream()
                .filter(book -> book.getAuthor().equalsIgnoreCase(author))
                .collect(Collectors.toList());
    }
}

九、优化与安全

为了确保我们的GraphQL API的安全性和性能,我们可以采取以下措施:

  1. 分页查询:对于大量数据的查询,使用分页技术来减少数据传输量。
  2. 数据验证:在解析器中进行数据验证,确保输入数据的合法性。
  3. 权限控制:使用Spring Security来保护GraphQL API,确保只有授权用户可以访问特定的数据。

十、总结

本文详细介绍了如何使用Spring Boot和GraphQL构建灵活的API服务。从环境搭建到Schema定义,从数据存储到查询实现,我们逐步构建了一个功能完善的GraphQL API,并展示了如何处理复杂查询和优化API。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:String,Spring,Boot,id,API,GraphQL,import,public
From: https://www.cnblogs.com/szk123456/p/18307165

相关文章

  • Spring Boot 开启事务支持详细总结
    Spring对事务的支持        Spring支持两种事务方式,分别是编程式事务和声明式事务,后者最常见,通常情况下只需要一个 @Transactional 就搞定了(代码侵入性降到了最低),就像这样:@TransactionalpublicvoidsavePosts(PostsParampostsParam){//保存文章save(p......
  • SAP中MIR4使用的BAPI是什么,如何使用?
    在SAP系统中,MIR4是一个用于采购发票校验的事务代码,它允许用户处理与采购订单相关的发票。关于MIR4使用的BAPI(BusinessApplicationProgrammingInterface,业务应用程序编程接口),并没有一个特定的、直接对应MIR4的BAPI名称,因为BAPI通常是针对SAP系统中特定的业务对象或功能而......
  • SAP中MR8M调用的BAPI是什么,如何使用?
    在SAP系统中,针对MR8M(通常与采购发票冲销相关)的操作,并没有直接命名为BAPI_MR8M的标准BAPI。然而,对于发票冲销这一功能,SAP提供了BAPI_INCOMINGINVOICE_CANCEL这一BAPI,它可以用于冲销传入的发票。BAPI_INCOMINGINVOICE_CANCEL的使用BAPI_INCOMINGINVOICE_CANCELBAPI是用于......
  • 【2024】springboot Home F家居系统的设计与管理
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • springboot整合第三方框架
    1.整合mybatis引入依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysq......
  • API引用在Element UI (Vue 2)和Element Plus (Vue 3)中的不同
    API变动样式类名变化:一些组件的样式类名有所变动,可能需要更新你的自定义样式。事件名和属性名变化:某些组件的事件名和属性名发生了变化,需要检查ElementPlus文档以了解详细信息。使用setup函数:在Vue3中,可以使用CompositionAPI(如setup函数)来组织代码,而......
  • spring boot的基础入门
    1.什么是springbootspringboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。spring项目搭建的缺点:[1]配置麻烦[2]依赖[3]tomcat启动慢2.springboot的特点1)自动配置SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过......
  • Spring事务原理、Spring事务传播机制
    Spring的@EnableTransactionManagement和@Transactional原理@Configuration@EnableTransactionManagementpublicclassAppConfig{//配置类内容}@ServicepublicclassMyService{@TransactionalpublicvoidprocessPayment(Payment......
  • 面试官:为什么SpringBoot的 jar 可以直接运行?
    引言传统Java应用部署:需要将应用打包成WAR文件,部署到如ApacheTomcat、Jetty等Web容器中。SpringBoot:改变了Java应用的开发体验,应用可以打包成可直接运行的jar文件,无需外部容器。SpringBootJAR包基础概念FatJAR(胖Jar):包含应用程序所需的全部依赖库和应用程序自身的......
  • Java面试 (5) :SSM(Spring框架、Spring MVC、MyBatis…)
    Java面试——SSM基础知识:Spring框架、SpringMVC、MyBatis…文章目录1String框架1.1IOC和DI1.2Bean1.2.1作用域1.2.2自动装配模式1.2.3生命周期1.2.3.1doGetBean()源码1.2.3.2七个阶段详解1.2.4Bean线程安全1.3常用的Spring注解1.4事务1.4.1Spring事务......