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错误。处理示例:
图书馆中也有
推荐