Como enviar uma requisição POST em PHP: do iniciante ao profissional
Você já se deparou com uma situação em que seu script PHP precisa "conversar" com outro servidor? Enviar dados de formulário, chamar uma API externa ou apenas verificar se um endpoint remoto está funcionando? Se sim, você certamente já se perguntou: "How do I send a POST request with PHP?". Esta é uma das perguntas mais populares no Stack Overflow, e não é à toa — a interação entre servidores está na base da web moderna.
Neste artigo, vamos explorar quatro maneiras comprovadas de enviar uma requisição POST em PHP. Você aprenderá como fazer isso usando cURL, file_get_contents, stream_context_create e o poderoso cliente HTTP Guzzle. Não vamos apenas mostrar o código — vamos explicar qual método escolher para sua tarefa e como evitar erros comuns.
Vamos lá! 🚀
O que é uma requisição POST e para que serve em PHP?
POST é um dos métodos do protocolo HTTP, projetado para enviar dados para um servidor. Ao contrário do GET, onde os parâmetros "aparecem" na URL, o POST transmite os dados no corpo da requisição. Isso é útil quando você precisa:
- Enviar um formulário de registro ou pedido;
- Chamar uma REST API (por exemplo, criar um novo registro em um CRM);
- Transferir um arquivo para um servidor remoto;
- Autenticar-se em um serviço de terceiros.
Em PHP, não há uma função nativa "sendPostRequest()", mas existem várias ferramentas flexíveis que permitem fazer isso. Vamos analisar cada uma delas.
Método 1: cURL — o canivete suíço
cURL (Client URL Library) é, sem dúvida, a maneira mais popular de enviar requisições HTTP em PHP. Ele suporta vários protocolos, trabalha com SSL, cookies, timeouts e proxies. Se você está escrevendo algo mais sério que um script de estudo — dê uma olhada no cURL.
Requisição POST simples com cURL
Aqui está um exemplo básico que envia uma requisição POST para o servidor de teste JSONPlaceholder e exibe a resposta:
// 1. Criar um novo recurso cURL$ch = curl_init();
// 2. Definir a URL do endpointcurl_setopt($ch, CURLOPT_URL, "https://jsonplaceholder.typicode.com/posts");
// 3. Indicar que é uma requisição POSTcurl_setopt($ch, CURLOPT_POST, 1);
// 4. Enviar os dados (o array PHP é convertido automaticamente em string de consulta)curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ 'title' => 'Meu primeiro post', 'body' => 'Este é o corpo do post', 'userId' => 1]));
// 5. Retornar o resultado, em vez de exibi-lo diretamentecurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 6. Executar a requisição$response = curl_exec($ch);
// 7. Verificar errosif (curl_errno($ch)) { echo 'Erro cURL: ' . curl_error($ch);} else { // 8. Fechar a conexão curl_close($ch); // 9. Exibir o resultado echo $response;}POST com JSON e cabeçalhos
APIs modernas geralmente trabalham com JSON. Veja como enviar dados JSON e definir o cabeçalho Content-Type correto:
$data = [ 'email' => 'user@example.com', 'password' => 'secret123'];
$ch = curl_init('https://api.example.com/login');curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Accept: application/json']);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); // Obter o código HTTP da resposta
curl_close($ch);
if ($httpCode === 200) { $result = json_decode($response, true); print_r($result);} else { echo "Erro: HTTP $httpCode";}Por que cURL? Ele oferece controle total: você pode configurar timeout (CURLOPT_TIMEOUT), seguir redirecionamentos (CURLOPT_FOLLOWLOCATION), enviar arquivos (CURLFile) e até trabalhar com FTP. A única desvantagem é que o código fica verboso.