PHP, cURL e HTTP POST: como enviar dados como um profissional em 2025
\n\nSe você já escreveu código em PHP que precisava "conversar" com outro servidor — enviar um formulário, chamar uma API ou simplesmente transmitir dados — com certeza já usou cURL. Não é apenas uma biblioteca, é um canivete suíço para requisições HTTP. E embora em 2025 tenhamos ferramentas mais modernas como Guzzle ou Symfony HttpClient, o cURL continua sendo a base que todo desenvolvedor PHP precisa conhecer.
\n\nA pergunta "PHP, cURL, and HTTP POST example?" no Stack Overflow tem milhares de visualizações. Por quê? Porque é aquela tarefa que aparece em praticamente todo projeto: desde integração com sistemas de pagamento até envio de dados para CRM. Vamos entender como fazer isso de forma correta, segura e elegante.
\n\nO que é cURL e por que usá-lo em PHP?
\n\ncURL (Client URL) é uma biblioteca poderosa que permite que seu script PHP atue como um cliente HTTP. Imagine que seu código é um navegador sem interface. Ele pode abrir páginas, enviar formulários, baixar arquivos e até trabalhar com cookies.
\n\nEm 2025, o cURL continua relevante porque:
\n- \n
- Ele já vem embutido no PHP (não precisa instalar pacotes extras) \n
- Funciona mais rápido que algumas bibliotecas "pesadas" \n
- Dá controle total sobre cada aspecto da requisição \n
- Suporta todos os protocolos modernos: HTTP/2, HTTPS, FTP e até IMAP \n
Exemplo básico: enviando uma requisição POST com cURL
\n\nVamos começar com o clássico. Aqui está um código funcional mínimo que envia uma requisição POST para um servidor:
\n\n<?php\n// URL para onde enviar os dados\n$url = 'https://api.exemplo.com/enviar';\n\n// Dados a serem enviados (array associativo)\n$postData = [\n 'nome' => 'João Silva',\n 'email' => 'joao@exemplo.com',\n 'mensagem' => 'Olá de 2025!'\n];\n\n// Inicializa o cURL\n$ch = curl_init($url);\n\n// Configurações da requisição\ncurl_setopt_array($ch, [\n CURLOPT_POST => true, // É uma requisição POST\n CURLOPT_POSTFIELDS => http_build_query($postData), // Dados em formato de string\n CURLOPT_RETURNTRANSFER => true, // Retorna a resposta como string\n CURLOPT_HEADER => false, // Não retorna cabeçalhos\n CURLOPT_TIMEOUT => 30, // Timeout de 30 segundos\n CURLOPT_SSL_VERIFYPEER => true, // Verifica certificado SSL\n]);\n\n// Executa a requisição\n$response = curl_exec($ch);\n\n// Verifica erros\nif (curl_errno($ch)) {\n echo 'Erro cURL: ' . curl_error($ch);\n} else {\n $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n echo "Código HTTP da resposta: $httpCode\\n";\n echo "Corpo da resposta: $response";\n}\n\n// Fecha a conexão\ncurl_close($ch);\n?>\n\nRepare no uso de http_build_query(). Essa função prática transforma um array em uma string codificada para URL. Sem ela, o cURL pode processar os dados de forma incorreta.
Enviando JSON em vez de formulário
\n\nEm 2025, a maioria das APIs trabalha com JSON, e não com formulários POST tradicionais. Veja como adaptar nosso exemplo:
\n\n<?php\n$url = 'https://api.exemplo.com/v2/usuarios';\n$jsonData = json_encode([\n 'usuario' => 'dev_2025',\n 'senha' => 'senha_secreta',\n 'cargo' => 'admin'\n]);\n\n$ch = curl_init($url);\ncurl_setopt_array($ch, [\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => $jsonData, // Envia JSON puro\n CURLOPT_HTTPHEADER => [ // Importante: definir cabeçalhos\n 'Content-Type: application/json',\n 'Content-Length: ' . strlen($jsonData),\n 'Accept: application/json'\n ],\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_TIMEOUT => 15,\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\nif ($http