GraphQL入门教程:构建更高效的APIs

2024-04-03 19:12

本文主要是介绍GraphQL入门教程:构建更高效的APIs,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GraphQL入门教程:构建更高效的APIs

GraphQL是一个用于API的查询语言,由Facebook于2015年公开发布。它允许客户端精确地指定它们需要从API获取哪些数据,从而使数据交换更加高效和强大。与传统的REST API相比,GraphQL提供了更加灵活和高效的方式来交互数据。

  • 类型系统(Type System): GraphQL的类型系统允许定义复杂的数据结构,这些结构可用作API的契约。这种强类型的特性不仅能够确保数据的一致性,还可以通过自省(introspection)查询,为前端开发者提供一个明确和自文档化(self-documenting)的API。
  • 查询(Query)与突变(Mutation): 查询用于获取数据,突变用于修改数据(包括创建、更新和删除)。GraphQL的这一设计哲学支持了数据的CRUD操作,同时保持了接口的简洁性。特别是,单一端点(single endpoint)的特性简化了前端的数据请求逻辑,无需记忆复杂的URL路径。
  • 实时订阅(Subscription): GraphQL的订阅机制支持实时数据更新,这对于构建动态响应的用户界面至关重要,例如实时聊天应用或股票价格更新。

GraphQL的优势在于其灵活性和效率

  1. 精确的数据获取:客户端可以精确指定它们需要哪些数据,避免了过度获取或数据不足的问题。
  2. 单一请求:不同于REST API需要多个请求来获取多资源的数据,GraphQL可以通过单一请求聚合多种数据。
  3. 强类型系统:GraphQL的类型系统和架构定义提供了清晰的API文档,使前后端开发更加一致且易于维护。

Spring Boot集成GraphQL

1、添加GraphQL依赖
<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>graphql-java-tools</artifactId><version>6.2.0</version>
</dependency>
2、定义GraphQL Schema

src/main/resources/graphql/目录下创建.graphqls文件定义GraphQL模式。例如,user.graphqls

type Query {userById(id: ID!): Userusers: [User!]!
}type Mutation {createUser(userInput: UserInput): UserupdateUser(id: ID!, userInput: UserInput): UserdeleteUser(id: ID!): Boolean
}input UserInput {name: String!email: String!age: Int
}type User {id: ID!name: String!email: String!age: Int
}
3、实现解析器

在Spring Boot项目中创建解析器,处理GraphQL操作:

@Component
public class UserResolver implements GraphQLQueryResolver, GraphQLMutationResolver {// 实现查询和突变方法@Autowiredprivate UserRepository userRepository; public User userById(String id) {return userRepository.findById(id);}public List<User> users() {return userRepository.findAll();}public User createUser(UserInput input) {return userRepository.save(new User(input.getName(), input.getEmail(), input.getAge()));}public User updateUser(String id, UserInput input) {return userRepository.update(id, input);}public boolean deleteUser(String id) {return userRepository.delete(id);}
}

React集成GraphQL

1、添加Apollo Client依赖

安装必要的包来在React项目中使用Apollo Client:

yarn add @apollo/client graphql
2、配置Apollo Client

src/app.ts或你的入口文件中设置Apollo Client:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { ApolloClient, InMemoryCache, ApolloProvider } from '@apollo/client';const client = new ApolloClient({uri: 'http://localhost:8080/graphql',cache: new InMemoryCache(),
});ReactDOM.render(<React.StrictMode><ApolloProvider client={client}><App /></ApolloProvider></React.StrictMode>,document.getElementById('root')
);
3、构建UI组件

创建React组件来进行用户的增、删、改、查操作,使用useQueryuseMutation钩子与GraphQL交互。

  1. 创建用户列表组件:

    使用useQuery钩子获取用户列表:

    import { useQuery, gql } from '@apollo/client';const GET_USERS = gql`query GetUsers {users {idnameemailage}}
    `;function Users() {const { loading, error, data } = useQuery(GET_USERS);if (loading) return <p>Loading...</p>;if (error) return <p>Error :(</p>;return (<div>{data.users.map(({ id, name, email, age }) => (<div key={id}><p>{`${name} (${email}) - Age: ${age}`}</p></div>))}</div>);
    }
    
  2. 创建增、删、改操作的React组件:

    使用useMutation钩子来创建、更新和删除用户。这里是一个创建用户的示例:

    import { useMutation, gql } from '@apollo/client';const CREATE_USER = gql`mutation CreateUser($userInput: UserInput!) {createUser(userInput: $userInput) {idname}}
    `;function AddUser() {let input;const [createUser, { data }] = useMutation(CREATE_USER);return (<div><formonSubmit={e => {e.preventDefault();createUser({ variables: { userInput: { name: input.value, email: "email@example.com", age: 30 } } });input.value = '';}}><inputref={node => {input = node;}}/><button type="submit">Add User</button></form></div>);
    }
    

这篇关于GraphQL入门教程:构建更高效的APIs的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873746

相关文章

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

Tomcat高效部署与性能优化方式

《Tomcat高效部署与性能优化方式》本文介绍了如何高效部署Tomcat并进行性能优化,以确保Web应用的稳定运行和高效响应,高效部署包括环境准备、安装Tomcat、配置Tomcat、部署应用和启动T... 目录Tomcat高效部署与性能优化一、引言二、Tomcat高效部署三、Tomcat性能优化总结Tom

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链