GraphQL API 与 C++:创建服务器的分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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",

博客

书籍推荐