Envio de SMS em C++: Guia Completo para Uso da API com a Biblioteca LibCurl
O envio de mensagens SMS é uma das funções-chave de aplicações modernas: desde autenticação de dois fatores até notificações de status de pedido. No ecossistema C++ não existem meios integrados para trabalhar com gateways SMS, no entanto, com a ajuda da biblioteca universal libcurl e requisições HTTP padrão, é possível integrar facilmente qualquer API REST de provedor SMS. Neste artigo, vamos analisar como escrever uma função robusta para envio de SMS em C++ usando a biblioteca LibCurl e examinar exemplos típicos para serviços populares (Twilio, SMS Aero, Bytehand).
Por que LibCurl?
LibCurl é uma biblioteca multiplataforma para transferência de dados por vários protocolos (HTTP, HTTPS, FTP, etc.). Ela suporta:
- Requisições GET, POST, PUT, DELETE
- SSL/TLS (HTTPS)
- Trabalho com cabeçalhos e corpo da requisição
- Processamento de respostas do servidor
Para enviar SMS, basta executar uma requisição POST para a API do provedor escolhido, passando os parâmetros necessários (número de telefone, texto, chave da API). A LibCurl cuida de todo o trabalho de baixo nível com sockets e criptografia.
Instalação da Biblioteca
Na maioria das distribuições Linux, a LibCurl pode ser instalada através do gerenciador de pacotes:
sudo apt-get install libcurl4-openssl-dev # Ubuntu/Debiansudo yum install libcurl-devel # CentOS/RHELPara Windows, você pode baixar DLLs pré-compiladas do site oficial ou usar vcpkg:
vcpkg install curlInclusão no código:
#include <curl/curl.h>#include <string>#include <json/json.h> // se usar JSON (nlohmann/json)Estrutura Básica da Função SMS
Vamos criar uma função universal sendSms, que recebe a URL da API, chave, número do destinatário e texto da mensagem. Para trabalhar com JSON, é conveniente usar a biblioteca nlohmann/json (somente cabeçalho, não requer compilação).
#include <iostream>#include <string>#include <curl/curl.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
// Callback para gravar a resposta do servidorstatic size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) { ((std::string*)userp)->append((char*)contents, size * nmemb); return size * nmemb;}
bool sendSms(const std::string& url, const std::string& apiKey, const std::string& phone, const std::string& message) { CURL *curl; CURLcode res; std::string readBuffer;
curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();
if(!curl) return false;
// Monta o corpo JSON da requisição json payload; payload["phone"] = phone; payload["text"] = message; payload["api_key"] = apiKey;
std::string jsonStr = payload.dump();
// Configuração da requisição HTTP struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "Accept: application/json");
curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonStr.c_str()); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
// Executa a requisição res = curl_easy_perform(curl);
// Limpeza curl_easy_cleanup(curl); curl_global_cleanup();
if(res != CURLE_OK) { std::cerr << "Erro curl: " << curl_easy_strerror(res) << std::endl; return false; }
// Analisa a resposta (exemplo para Twilio) try { json response = json::parse(readBuffer); if(response.co Também na biblioteca
Cache em Go (Golang): Redis, in-memory e outras soluções
Monitoramento de aplicações TypeScript: ferramentas e bibliotecas
Jetpack Compose para Kotlin: guia completo com exemplos