C++上的GraphQL:cppgraphqlgen——现代API的强大工具
GraphQL是一种API查询语言,允许客户端仅获取所需数据。尽管GraphQL通常与JavaScript(Apollo、Relay)或Python(Graphene、Strawberry)相关联,但对于C++高负载系统,也存在一个出色的解决方案——cppgraphqlgen库。它提供了一套完整的工具,用于在纯C++上创建GraphQL服务端,并支持C++17/20现代标准。
什么是cppgraphqlgen?
cppgraphqlgen是一个header-only库(可选择编译为.so/.dll),实现了GraphQL规范(2018年6月)。它基于模式(SDL——模式定义语言)生成类型安全的代码,并允许创建高效、多线程的GraphQL服务器。
主要特点:
- 从模式生成代码——您在
.graphql文件中描述类型、查询和变更,graphqlgen工具会生成C++类。 - 类型安全——所有类型在编译阶段进行检查。没有运行时类型错误。
- 性能——最小开销,支持异步解析器(通过
std::future)。 - 支持订阅(Subscriptions)——通过WebSocket或gRPC。
- 与任何HTTP服务器集成——可与
crow、drogon、beast(Boost.Asio)甚至自定义实现一起使用。
库的架构
cppgraphqlgen由两部分组成:
- 代码生成器(
graphqlgen)——读取模式并为每个类型创建头文件,包含解析器接口和辅助函数。 - 运行时库——查询解析器、验证器、执行器和响应序列化器。
安装
该库通过vcpkg分发,或从源代码编译:
git clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target install使用生成器需要node.js(它用TypeScript编写),但运行时是纯C++。
示例:创建一个简单的GraphQL服务器
首先创建模式文件schema.graphql:
type Query { hello: String user(id: Int!): User}
type User { id: Int name: String email: String}然后运行生成器:
graphqlgen --schema schema.graphql --output ./generated之后,在generated文件夹中会出现文件:SchemaTypes.h、SchemaResolver.h等。现在编写解析器:
#include "generated/SchemaTypes.h"#include "generated/SchemaResolver.h"
class QueryResolver : public graphql::schema::Query::Resolver {public: std::shared_ptr<graphql::schema::String> getHello() override { return std::make_shared<graphql::schema::String>("Hello, GraphQL from C++!"); }
std::shared_ptr<graphql::schema::User> getUser(int id) override { auto user = std::make_shared<graphql::schema::User>(); user->id = std::make_shared<graphql::schema::Int>(id); user->name = std::make_shared<graphql::schema::String>("John Doe"); user->email = std::make_shared<graphql::schema::String>("john@example.com"); return user; }};现在使用crow构建服务器:
#include <crow.h>#include "generated/Schema.h"