Trabalhando com APIs em C++: REST, GraphQL, gRPC
Quando se trata de criar ou consumir APIs, muitos desenvolvedores, por hábito, recorrem ao Python, Node.js ou Go. Mas o que fazer se você precisa de desempenho máximo, controle de baixo nível sobre a memória ou trabalha em um sistema legado onde C++ é o rei? A resposta é simples: C++ não apenas vive — ele prospera no mundo das APIs. Vamos analisar três abordagens principais que todo desenvolvedor C++ deve conhecer: o clássico REST, o moderno GraphQL e o de alto desempenho gRPC.
Este artigo não é um guia de referência seco, mas sim um guia prático, escrito para quem deseja escrever código real. Veremos como essas tecnologias são aplicadas em C++, daremos exemplos com bibliotecas populares e ajudaremos você a escolher a ferramenta certa para sua tarefa.
1. API REST em C++: o clássico em uma roupagem moderna
REST (Representational State Transfer) continua sendo o estilo de API mais comum. É apreciado por sua simplicidade, legibilidade humana do JSON e versatilidade. Em C++, temos várias ferramentas poderosas para trabalhar com REST, e uma das mais populares é a cpprestsdk (também conhecida como Casablanca) da Microsoft.
Escrevendo um cliente REST em C++
Imagine que precisamos obter dados meteorológicos de uma API pública. Veja como fica com cpprestsdk:
#include <cpprest/http_client.h>#include <cpprest/filestream.h>#include <iostream>
using namespace web;using namespace web::http;using namespace web::http::client;
int main() { // Criando um cliente HTTP http_client client(U("https://api.openweathermap.org/data/2.5"));
// Montando uma requisição GET com parâmetros uri_builder builder(U("/weather")); builder.append_query(U("q"), U("Moscow")); builder.append_query(U("appid"), U("YOUR_API_KEY")); builder.append_query(U("units"), U("metric"));
// Enviando a requisição e obtendo a resposta client.request(methods::GET, builder.to_string()) .then([](http_response response) { if (response.status_code() == status_codes::OK) { return response.extract_json(); } throw std::runtime_error("Falha ao buscar dados"); }) .then([](json::value jsonData) { std::cout << "Temperatura: " << jsonData[U("main")][U("temp")].as_double() << "°C" << std::endl; }) .wait();
return 0;}Pontos-chave:
- Assincronicidade: cpprestsdk usa PPL (Parallel Patterns Library) e futures, o que é ideal para C++.
- Trabalhando com JSON: o analisador embutido json::value permite manipular dados facilmente.
- Multiplataforma: a biblioteca funciona no Windows, Linux e macOS.
Quando escolher REST?
REST em C++ é ideal para:
- Operações CRUD simples
- Integração com serviços web (redes sociais, sistemas de pagamento)
- Prototipagem e microsserviços com baixa carga
2. GraphQL: flexibilidade de consultas em C++
GraphQL resolve o principal problema do REST — overfetching (obter dados desnecessários) e underfetching (necessidade de várias requisições para obter informações completas). Em C++, para trabalhar com GraphQL, geralmente se usa a biblioteca cppgraphql ou se escreve um cliente próprio baseado em libcurl.
Exemplo de consulta GraphQL em C++
Suponha que precisamos obter o perfil de um usuário e suas postagens mais recentes — no REST, isso exigiria duas requisições, mas no GraphQL, apenas uma:
#include <iostream>#include <curl/curl.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->a