GraphQL在C++中的应用:用于现代API的cppgraphqlgen库

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

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

开始课程

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由两部分组成:

  1. 代码生成器(graphqlgen)——读取模式并为每个类型创建头文件,包含解析器接口和辅助函数。
  2. 运行时库——查询解析器、验证器、执行器和响应序列化器。


安装

该库通过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"

推荐