GraphQL em C++: biblioteca cppgraphqlgen para criação de APIs

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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, beast do 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 install


Exemplo 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:


                
    
    

Recommendations