Parte 04 · A

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).

01

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).

cep-simples.php
<?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
⚠️ Atenção: 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).
02

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.

cep-curl.php
<?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
03

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.

post-curl.php
<?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
📌 Nota: o JSONPlaceholder é uma API de teste — ele finge que criou o recurso e sempre devolve o id 101, mas não salva nada de verdade. Perfeito para praticar.
04

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.

api-produtos.php
<?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}]
← Parte 3 · Banco de dados Voltar à capa →