Biblioteca GraphQL C++: cppgraphqlgen
cppgraphqlgen é uma biblioteca moderna em C++ para implementação do lado do servidor GraphQL. Ela permite que desenvolvedores criem APIs type-safe, rápidas e escaláveis, aproveitando as vantagens da tipagem estática do C++. A biblioteca gera código com base no esquema GraphQL (arquivos .graphql), o que minimiza a escrita manual de resolvers e reduz a probabilidade de erros.
Principais recursos
- Geração de código a partir do esquema — na entrada, é fornecido um arquivo schema.graphql; na saída, são geradas classes e funções C++.
- Type-safety — todos os tipos GraphQL (String, Int, Float, Boolean, ID, Enum, Input, Object) são compilados nos tipos C++ correspondentes.
- Suporte a Subscriptions — implementado via WebSocket e fluxos assíncronos.
- Validação de consultas — verificação embutida de sintaxe e semântica de consultas GraphQL.
- Integração com HTTP — funciona sobre qualquer servidor HTTP C++ (por exemplo,
beastdo Boost). - Suporte a diretivas — diretivas personalizadas para estender a funcionalidade.
Instalação
Para instalar o cppgraphqlgen, é necessário um compilador com suporte a C++17 e o sistema de build CMake. Instalação via vcpkg ou compilação a partir do código fonte:
# Via vcpkgvcpkg install cppgraphqlgen
# Compilação a partir do repositóriogit clone https://github.com/microsoft/cppgraphqlgen.gitcd cppgraphqlgenmkdir build && cd buildcmake .. -DCMAKE_BUILD_TYPE=Releasecmake --build . --target installExemplo de uso
Vamos considerar um exemplo simples: criar um esquema GraphQL para obter informações sobre um usuário e um livro. Primeiro, definimos o esquema 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!}Após a geração do código (comando graphqlgen), obtemos o arquivo Generated.h. Agora, escrevemos os resolvers em C++:
#include "Generated.h"#include <unordered_map>
// Dados de exemplo (em um projeto real, seria um banco de dados)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"}}};
// Resolver para Query.userUser resolveGetUser(const std::string& id) { auto it = users.find(id); if (it != users.end()) { return it->second; } throw std::runtime_error("User not found");}
// Resolver para Query.bookBook resolveGetBook(const std::string& id) { auto it = books.find(id); if (it != books.end()) { return it->second; } throw std::runtime_error("Book not found");}Agora, configuramos o servidor e iniciamos o processamento de consultas:
#include <graphqlservice/GraphQLService.h>#include <beast/http.hpp>
int main() { // Cria o serviço com o esquema auto service = std::make_shared<graphql::service::GraphQLService>();
// Registra os resolvers service->addResolver("Query", "user", resolveGetUser); service->addResolver("Query", "book", resolveGetBook);
// Inicia o servidor HTTP (simplificado) http::server server("0.0.0.0", 8080, service); server.run();
return 0;}Tratamento de erros e validação
A biblioteca verifica automaticamente a correção das consultas recebidas. Se um resolver lançar uma exceção, o cppgraphqlgen a converte em um erro GraphQL com o código correspondente. Exemplo de tratamento:
Também na biblioteca
Trabalhando com Excel em TypeScript: bibliotecas, exemplos e ferramentas
Configuração de aplicações C# (.NET): bibliotecas e abordagens
Trabalhando com YAML em PHP: biblioteca Symfony Yaml e parsing de dados
Processamento de imagens em Kotlin: resize e crop com a biblioteca Kamel
Bibliotecas WebSocket Kotlin para criar tempo real em aplicações web
Recommendations