Introdução: por que você precisa de um cliente HTTP em PHP?
As aplicações web modernas raramente existem isoladamente. Elas interagem com APIs externas, serviços de arquitetura de microsserviços, sistemas de análise e gateways de pagamento. No centro dessa interação está o protocolo HTTP. Para o desenvolvedor PHP, saber como enviar requisições HTTP corretamente não é apenas uma habilidade útil, mas uma parte obrigatória do kit de ferramentas profissional.
Neste artigo, vamos analisar três maneiras principais de criar um cliente HTTP em PHP: desde o simples file_get_contents() até o poderoso cURL e o moderno pacote Guzzle. Você aprenderá como escolher a ferramenta adequada, tratar erros, trabalhar com cabeçalhos e garantir a segurança das requisições.
1. Requisições simples com file_get_contents()
A maneira mais simples de enviar uma requisição GET em PHP é usar a função embutida file_get_contents(). Este método é adequado para protótipos rápidos e cenários simples, onde não é necessário um ajuste fino da conexão.
Requisição GET básica
<?php$url = 'https://api.example.com/data';$response = file_get_contents($url);if ($response === false) { echo 'Erro ao obter dados';} else { echo $response;}?>Configuração de contexto de stream
Para gerenciar cabeçalhos e o método da requisição, use stream_context_create(). Isso permite enviar requisições POST e definir cabeçalhos personalizados.
<?php$data = json_encode(['name' => 'John', 'email' => 'john@example.com']);$options = [ 'http' => [ 'method' => 'POST', 'header' => "Content-Type: application/json\\r" . "Accept: application/json\\r", 'content' => $data ]];$context = stream_context_create($options);$result = file_get_contents('https://api.example.com/users', false, $context);if ($result === false) { // Tratamento de erro}?>Desvantagens: file_get_contents() não suporta cookies, timeouts em nível de conexão, tratamento de redirecionamentos e trabalho com certificados SSL. Para projetos sérios, é melhor usar cURL ou Guzzle.
2. cURL poderoso e flexível
A extensão cURL (Client URL Library) é a ferramenta padrão para trabalhar com HTTP em PHP. Ela fornece controle total sobre a requisição: cabeçalhos, corpo, timeouts, autenticação, trabalho com arquivos e muito mais.
Requisição GET básica com cURL
<?php$ch = curl_init('https://api.example.com/data');curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_TIMEOUT, 30);$response = curl_exec($ch);if (curl_errno($ch)) { echo 'Erro cURL: ' . curl_error($ch);} else { $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo "Código HTTP: $httpCode"; echo $response;}curl_close($ch);?>Requisição POST com JSON e cabeçalhos
<?php$postData = ['title' => 'PHP HTTP Client', 'body' => 'Exemplo de requisição'];$jsonData = json_encode($postData);$ch = curl_init('https://jsonplaceholder.typicode.com/posts');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $jsonData, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Accept: application/json', 'Authorization: Bearer YOUR_TOKEN_HERE' ], CURLOPT_TIMEOUT => 15, CURLOPT_SSL_VERIFYPEER => true // Em produção, sempre true!]);$result = curl_exec($ch);$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);if ($httpCode >= 200 && $httpCode < 300) { $decoded = json_decode($result, true); print_r($decoded);} else { echo "Erro: HTTP $httpCode";}?>Opções úteis do cURL
CURLOPT_