Requisições a API
Como o PHP conversa com serviços externos pela web: ler dados de uma API, enviar dados e até criar a sua própria API que devolve JSON. Exemplos com APIs públicas reais (ViaCEP e JSONPlaceholder).
GET com file_get_contents (ViaCEP)
A forma mais simples de ler uma API: file_get_contents() baixa o conteúdo da URL como string. Depois, json_decode($txt, true) transforma o JSON em array associativo (o true é o que faz virar array, e não objeto).
<?php
$url = "https://viacep.com.br/ws/01001000/json/";
// @ evita warning feio; checamos o retorno logo abaixo.
$resposta = @file_get_contents($url);
if ($resposta === false) {
exit("Erro ao consultar o CEP.");
}
// true = devolve array associativo (sem ele, viria um objeto stdClass).
$dados = json_decode($resposta, true);
echo $dados["logradouro"]; // Praça da Sé
echo $dados["localidade"]; // São Paulo
file_get_contents em URL só funciona se allow_url_fopen estiver ligado no php.ini (no XAMPP já vem ligado). Para algo mais robusto, prefira o cURL (a seguir).
cURL GET + checagem de status
O cURL é o jeito profissional de fazer requisições. CURLOPT_RETURNTRANSFER faz o resultado ser retornado (em vez de impresso direto). E dá para ler o código HTTP com CURLINFO_HTTP_CODE para tratar erros.
<?php
$ch = curl_init("https://viacep.com.br/ws/01001000/json/");
// Sem isto, curl_exec imprimiria e retornaria apenas true.
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$resposta = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // ex.: 200
curl_close($ch);
// Trata falha de rede (false) ou status diferente de 200.
if ($resposta === false || $status !== 200) {
exit("Falha na requisição (HTTP $status).");
}
$dados = json_decode($resposta, true);
echo $dados["bairro"] . " / " . $dados["uf"]; // Sé / SP
cURL POST enviando JSON
Para criar algo numa API, manda-se um POST com o corpo em JSON. Os passos: montar o JSON com json_encode, ligar CURLOPT_POST, pôr o corpo em CURLOPT_POSTFIELDS e informar o header Content-Type: application/json.
<?php
// Corpo da requisição como JSON.
$payload = json_encode([
"title" => "Olá",
"body" => "Conteúdo do post",
"userId" => 1,
]);
$ch = curl_init("https://jsonplaceholder.typicode.com/posts");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
$resposta = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE); // 201 (Created)
curl_close($ch);
if ($status !== 201) {
exit("Não foi possível criar (HTTP $status).");
}
$novo = json_decode($resposta, true);
echo "Criado com ID: " . $novo["id"]; // Criado com ID: 101
101, mas não salva nada de verdade. Perfeito para praticar.
Criar uma mini-API que devolve JSON
Você também pode ser o servidor. Basta enviar o header Content-Type: application/json e dar echo no json_encode de um array. Qualquer cliente (JS, app, outra API) consegue consumir.
<?php
// Avisa ao cliente que a resposta é JSON (não HTML).
header("Content-Type: application/json; charset=utf-8");
$produtos = [
["id" => 1, "nome" => "Teclado", "preco" => 120.00],
["id" => 2, "nome" => "Mouse", "preco" => 80.00],
];
// JSON_UNESCAPED_UNICODE mantém acentos legíveis (ã, ç...).
echo json_encode($produtos, JSON_UNESCAPED_UNICODE);
// Saída (repare: 120.00 vira 120 — float perde os zeros à direita):
// [{"id":1,"nome":"Teclado","preco":120},{"id":2,"nome":"Mouse","preco":80}]