API GraphQL com C++: Tutorial Passo a Passo
GraphQL é uma poderosa linguagem de consulta para APIs que permite aos clientes obter exatamente os dados de que precisam, sem nada extra. Embora C++ não seja a linguagem mais popular para criar APIs web, seu desempenho e controle sobre a memória o tornam uma excelente escolha para sistemas de alta carga. Neste tutorial, criaremos um servidor GraphQL funcional em C++ usando a biblioteca graphql-cpp.
O que é necessário para começar
Para trabalhar, você precisará de:
- Compilador com suporte a C++17 (GCC 8+, Clang 7+, MSVC 2019+)
- CMake versão 3.14 ou superior
- Biblioteca
graphql-cpp(instalação via vcpkg ou compilação a partir dos fontes) - Biblioteca
libmicrohttpdpara o servidor HTTP
Instalaremos as dependências via vcpkg:
git clone https://github.com/microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg install graphql-cpp libmicrohttpdCriação da estrutura básica do projeto
Começaremos configurando o projeto CMake. Crie o arquivo CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)project(graphql-cpp-tutorial)
set(CMAKE_CXX_STANDARD 17)set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(graphql-cpp CONFIG REQUIRED)find_package(MHD CONFIG REQUIRED)
add_executable(graphql-server main.cpp)target_link_libraries(graphql-server graphql-cpp::graphql-cpp MHD::MHD)Agora criaremos o arquivo principal main.cpp com um servidor mínimo:
#include <graphql-cpp/GraphQL.h>#include <microhttpd.h>#include <iostream>#include <string>
using namespace graphql::cpp;
// Função de tratamento de requisições HTTPstatic enum MHD_Result request_handler(void* cls, struct MHD_Connection* connection, const char* url, const char* method, const char* version, const char* upload_data, size_t* upload_data_size, void** con_cls) { const char* response_str = "{\\"data\\":{\\"hello\\":\\"world\\"}}"; struct MHD_Response* response = MHD_create_response_from_buffer( strlen(response_str), (void*)response_str, MHD_RESPMEM_PERSISTENT ); MHD_add_response_header(response, "Content-Type", "application/json"); int ret = MHD_queue_response(connection, MHD_HTTP_OK, response); MHD_destroy_response(response); return ret == MHD_YES ? MHD_YES : MHD_NO;}
int main() { struct MHD_Daemon* daemon = MHD_start_daemon( MHD_USE_INTERNAL_POLLING_THREAD, 4000, NULL, NULL, &request_handler, NULL, MHD_OPTION_END ); if (daemon == NULL) { std::cerr << "Falha ao iniciar o servidor" << std::endl; return 1; } std::cout << "Servidor rodando em http://localhost:4000/graphql" << std::endl; getchar(); MHD_stop_daemon(daemon); return 0;}Definição do esquema GraphQL
Agora adicionaremos um esquema GraphQL real. Criaremos o tipo Book e o tipo raiz Query:
#include <graphql-cpp/Schema.h>#include <graphql-cpp/Type.h>#include <vector>#include <memory>
using namespace graphql::cpp;
// Modelo de dadosstruct Book { int id; std::string title; std::string author; int year;};
// Repositório de livros (simulação de banco de dados)class BookRepository {public: static std::vector<Book> getAll() { return { {1, "Guerra e Paz", "Liev Tolstói", 1869}, {2, "Crime e Castigo", "Fiódor Dostoiévski", 1866}, {3, "O Mestre e a Margarida", "Mikhail Bulgákov", 1967} }; } static Book getById(int id) { auto books = getAll(); for (const auto& book
```