C++ 上的 GraphQL API:带实践示例的逐步教程

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

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

开始课程

引言:GraphQL 和 C++——现代 API 的强大组合

\n\n

GraphQL 正在成为构建灵活高效 API 的事实标准。虽然大多数教程侧重于 JavaScript 或 Python,但 C++ 在高负载系统、游戏服务器和嵌入式解决方案中仍然不可或缺。在本逐步指南中,我们将使用 graphql-cpp 库和 cpp-httplib 服务器,从零开始创建一个完整的 C++ GraphQL API。

\n\n

您将学习如何配置环境、定义模式、实现解析器以及启动服务器。所有代码示例均可直接应用于实际项目。

\n\n

1. 环境准备与依赖安装

\n\n

我们需要以下工具:

\n
    \n
  • 支持 C++17 的编译器(GCC 8+、Clang 7+、MSVC 2019+)
  • \n
  • CMake(版本 3.14+)
  • \n
  • graphql-cpp 库(GraphQL 实现)
  • \n
  • cpp-httplib 库(HTTP 服务器)
  • \n
  • vcpkg 包管理器(可选,但很方便)
  • \n
\n\n

通过 vcpkg 安装

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install graphql-cpp cpp-httplib nlohmann-json
\n\n

项目结构

\n
graphql-cpp-api/\n├── CMakeLists.txt\n├── src/\n│   ├── main.cpp\n│   ├── schema.cpp\n│   ├── schema.h\n│   ├── resolvers.cpp\n│   └── resolvers.h\n└── vcpkg.json
\n\n

CMakeLists.txt

\n
cmake_minimum_required(VERSION 3.14)\nproject(GraphQLCppApi)\n\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\nfind_package(graphql-cpp CONFIG REQUIRED)\nfind_package(cpp-httplib CONFIG REQUIRED)\nfind_package(nlohmann_json CONFIG REQUIRED)\n\nadd_executable(graphql_server\n    src/main.cpp\n    src/schema.cpp\n    src/resolvers.cpp\n)\n\ntarget_link_libraries(graphql_server\n    graphql-cpp::graphql-cpp\n    cpp-httplib::cpp-httplib\n    nlohmann_json::nlohmann_json\n)
\n\n

现在一切就绪,可以开始编写代码了。

\n\n

2. 定义 GraphQL 模式与类型

\n\n

我们首先为简单的图书管理 API 创建模式。将包含 Book 和 Author 类型,以及查询和变更操作。

\n\n

schema.h

\n
#ifndef SCHEMA_H\n#define SCHEMA_H\n\n#include <graphqlcpp/GraphQLSchema.h>\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema();\n\n#endif
\n\n

schema.cpp

\n
#include "schema.h"\n#include "resolvers.h"\n\nstd::shared_ptr<graphql::GraphQLSchema> createSchema() {\n    using namespace graphql;\n\n    // Author 类型\n    auto authorType = object_type("Author", {\n        field("id", int_type()),\n        field("name", string_type()),\n        field("books", list_type(int_type()))\n    });\n\n    // Book 类型\n    auto bookType = object_type("Book", {\n        field("id", int_type()),\n        field("title", string_type()),\n        field("authorId", int_type()),\n        field("year", int_type()),\n        field("genre", string_type())\n    });\n\n    // Query 根类型\n    auto queryType = object_type("Query", {\n        field("books", list_type(bookType), {\n            argument("genre", string_type(), true)  // 可选参数\n        }, resolveBooks),\n        field("book", bookType, {\n            argument("id", int_type(), false)       // 必选参数\n        }, resolveBookById),\n        field("authors", list_type(authorType), resolveAuthors)\n    });\n\n    // Mutation 根类型\n    auto mutationType = object_type("Mutation", {\n        field("addBook", bookType, {\n            argument("title", string_type(), false),\n            argument("authorId", int_type(), false),\n            argument("year", int_type(), false),\n            argument("genre", string_type(), false)\n        }, resolveAddBook),\n        field("deleteBook", bool_type(), {\n            argument("id", int_type(), false)\n        }, res                

博客

书籍推荐