Introdução: por que preciso de um cliente HTTP em PHP?
\n\nO desenvolvimento web moderno é impensável sem a interação com serviços externos. Seja enviando dados para uma API de terceiros, obtendo taxas de câmbio ou integrando com um gateway de pagamento — todo desenvolvedor PHP enfrenta a necessidade de executar requisições HTTP. Criar um cliente HTTP confiável em PHP é uma competência básica que permite que sua aplicação se comunique com o resto do mundo.
\n\nNeste artigo, abordaremos duas abordagens principais: o uso da extensão nativa cURL e da biblioteca popular Guzzle. Você aprenderá como enviar corretamente requisições GET, POST, PUT e DELETE, tratar erros e trabalhar com cabeçalhos. O material será útil tanto para iniciantes quanto para desenvolvedores experientes que desejam sistematizar seus conhecimentos.
\n\n1. Fundamentos do cliente HTTP em PHP: trabalhando com cURL
\n\n1.1. O que é cURL e por que é importante
\n\ncURL (Client URL Library) é uma poderosa extensão do PHP que permite interagir com diversos servidores usando os protocolos HTTP, HTTPS, FTP e outros. Ela faz parte da distribuição padrão do PHP, mas às vezes requer ativação separada no php.ini. O cURL oferece controle total sobre a requisição: você pode definir qualquer método, cabeçalhos, corpo da requisição e timeouts.
\n\n1.2. Requisição GET simples com cURL
\n\nVamos começar com o cenário mais comum — obter dados de um servidor. Veja um exemplo de requisição à API pública JSONPlaceholder:
\n\n<?php\n// Inicialização da sessão cURL\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n\n// Configuração das opções\ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);\ncurl_setopt($ch, CURLOPT_HTTPGET, true);\ncurl_setopt($ch, CURLOPT_TIMEOUT, 30);\n\n// Execução da requisição\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\n\n// Verificação de erros\nif (curl_errno($ch)) {\n echo 'Erro cURL: ' . curl_error($ch);\n} else {\n echo "Código HTTP: $httpCode\\n";\n $data = json_decode($response, true);\n print_r($data);\n}\n\n// Fechamento da sessão\ncurl_close($ch);\n?>\n\nObserve: sempre verificamos o código de resposta e a presença de erros. CURLOPT_RETURNTRANSFER garante que o resultado seja retornado em uma variável, e não exibido diretamente.
1.3. Envio de requisição POST com dados
\n\nPara enviar dados ao servidor (por exemplo, ao criar um novo registro), usamos o método POST. Os dados podem ser transmitidos como array ou string JSON:
\n\n<?php\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts');\n\n$postData = [\n 'title' => 'Novo post',\n 'body' => 'Conteúdo do post',\n 'userId' => 1\n];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_POST => true,\n CURLOPT_POSTFIELDS => json_encode($postData), // JSON\n CURLOPT_HTTPHEADER => [\n 'Content-Type: application/json',\n 'Accept: application/json'\n ],\n CURLOPT_TIMEOUT => 30\n]);\n\n$response = curl_exec($ch);\n$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);\ncurl_close($ch);\n\necho "Código HTTP: $httpCode\\n";\necho $response;\n?>\n\nPonto-chave: se você passar um array em CURLOPT_POSTFIELDS, o PHP o codificará automaticamente como application/x-www-form-urlencoded. Para JSON, use json_encode() e especifique explicitamente o cabeçalho Content-Type.
1.4. Requisições PUT e DELETE
\n\nPara atualizar e excluir recursos, são usados os métodos PUT e DELETE. No cURL, eles são definidos através da opção CURLOPT_CUSTOMREQUEST:
<?php\n// Requisição PUT (atualização)\n$ch = curl_init('https://jsonplaceholder.typicode.com/posts/1');\n$updateData = ['title' => 'Título atualizado'];\n\ncurl_setopt_array($ch, [\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_CUSTOMREQUEST => 'PUT',\n CURLOPT_POSTFIELDS => json_encode($updateData),\n CURLOPT_HTTPHEADER =>