GraphQL API 与 C++:逐步教程
GraphQL 是一种由 Facebook 开发的 API 查询语言。与 REST 不同,它允许客户端仅请求所需的数据,从而减少传输的信息量并加速应用程序运行。在本教程中,我们将使用 graphql-cpp 库创建一个简单的基于 C++ 的 GraphQL 服务器。您将学习如何定义模式、编写解析器以及处理查询和变更。
什么是 GraphQL 以及为什么选择 C++?
GraphQL 为所有查询提供统一的端点。核心概念包括:
- 模式 (Schema) — 可用数据类型和操作(查询、变更、订阅)的描述。
- 查询 (Queries) — 数据读取操作。
- 变更 (Mutations) — 数据写入/修改操作。
- 解析器 (Resolvers) — 为每个字段返回数据的函数。
C++ 是一种适用于高负载系统的强大语言。将 GraphQL 与 C++ 结合使用可以创建高效且可扩展的 API。graphql-cpp 库提供了便捷的集成接口。
项目安装与配置
我们需要以下工具:
- C++17 编译器(例如 g++ 或 MSVC)。
graphql-cpp库(通过 vcpkg 安装或从源码构建)。- HTTP 服务器(为简单起见,我们将使用
cpp-httplib)。
通过 vcpkg 安装
vcpkg install graphql-cppvcpkg install cpp-httplib项目结构
创建以下文件:
main.cpp— 入口点和 HTTP 服务器。schema.hpp— GraphQL 模式定义。resolvers.hpp— 解析器实现。CMakeLists.txt— 构建配置。
定义 GraphQL 模式
创建一个简单的模式来管理用户列表。User 类型包含 id、name 和 email 字段。查询:users(所有用户列表)和 user(id: ID!)(单个用户)。变更:addUser(name: String!, email: String!): User。
在 schema.hpp 文件中:
#ifndef SCHEMA_HPP#define SCHEMA_HPP
#include <graphqlcpp/GraphQLSchema.h>
using namespace graphqlcpp;
// 定义 User 类型auto userType = std::make_shared<ObjectType>( "User", { {"id", Type::NonNull(Type::ID)}, {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} });
// 定义 Queryauto queryType = std::make_shared<ObjectType>( "Query", { {"users", Type::List(Type::NonNull(userType))}, {"user", Type::NonNull(userType), {{"id", Type::NonNull(Type::ID)}}} });
// 定义 Mutationauto mutationType = std::make_shared<ObjectType>( "Mutation", { {"addUser", Type::NonNull(userType), { {"name", Type::NonNull(Type::String)}, {"email", Type::NonNull(Type::String)} }} });
// 组装模式auto schema = std::make_shared<Schema>(queryType, mutationType);
#endif // SCHEMA_HPP实现解析器
解析器是为每个字段返回数据的函数。在我们的示例中,数据将存储在全局向量中。在 resolvers.hpp 文件中:
#ifndef RESOLVERS_HPP#define RESOLVERS_HPP
#include <vector>#include <string>#include <graphqlcpp/Resolvers.h>
using namespace graphqlcpp;
struct User { std::string id; std::string name; std::string email;};
std::vector<User> users = { {"1",