GraphQL在C++中:用于创建API的cppgraphqlgen库

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

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

开始课程

GraphQL C++库:cppgraphqlgen



cppgraphqlgen 是一个用于实现GraphQL服务端的现代C++库。它允许开发者利用C++静态类型化的优势,创建类型安全、快速且可扩展的API。该库基于GraphQL模式(.graphql文件)生成代码,从而最大限度地减少手动编写解析器的工作量并降低出错概率。



主要功能

  • 从模式生成代码 — 输入schema.graphql文件,输出C++类和函数。
  • 类型安全 — 所有GraphQL类型(String、Int、Float、Boolean、ID、Enum、Input、Object)都会被编译为相应的C++类型。
  • 支持订阅(Subscriptions) — 通过WebSocket和异步流实现。
  • 请求验证 — 内置GraphQL查询的语法和语义检查。
  • 与HTTP集成 — 可运行在任何C++ HTTP服务器之上(例如,来自Boost的beast)。
  • 支持指令 — 用于扩展功能的自定义指令。


安装

安装cppgraphqlgen需要支持C++17的编译器和CMake构建系统。可以通过vcpkg安装或从源码构建:

# 通过vcpkgvcpkg install cppgraphqlgen

# 从仓库构建git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target install


使用示例

考虑一个简单的例子:创建一个GraphQL模式来获取用户和书籍信息。首先定义模式schema.graphql:

type Query {  user(id: ID!): User  book(id: ID!): Book}

type User { id: ID! name: String! email: String}

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


代码生成后(使用graphqlgen命令),得到Generated.h文件。现在用C++编写解析器:

#include "Generated.h"#include <unordered_map>

// 示例数据(实际项目中为数据库)std::unordered_map<std::string, User> users = { {"1", {"1", "Alice", "alice@example.com"}}, {"2", {"2", "Bob", nullptr}}};

std::unordered_map<std::string, Book> books = { {"10", {"10", "C++ Primer", "Lippman"}}, {"20", {"20", "Effective Modern C++", "Meyers"}}};

// Query.user的解析器User resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}

// Query.book的解析器Book resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}


现在配置服务器并开始处理请求:

#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>

int main() { // 创建带有模式的服务 auto service = std::make_shared<graphql::service::GraphQLService>();

// 注册解析器 service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);

// 启动HTTP服务器(简化版) http::server server("0.0.0.0", 8080, service); server.run();

return 0;}


错误处理与验证

该库会自动检查传入请求的正确性。如果解析器抛出异常,cppgraphqlgen会将其转换为带有相应代码的GraphQL错误。处理示例:


                
    
    

推荐