🌐 O que é uma API?
Uma API (Application Programming Interface) é um conjunto de regras e protocolos que permite que diferentes aplicações comuniquem entre si. Define como os componentes de software devem interagir.
Pensa numa API como um garçom num restaurante:
- Tu (cliente) = A tua aplicação PHP
- Garçom (API) = Intermediário que recebe pedidos e entrega respostas
- Cozinha (servidor) = O serviço que processa e devolve os dados
Não precisas de saber como a cozinha funciona - apenas fazes o pedido através do garçom e recebes o resultado!
Tipos de APIs
🌐 Web APIs / REST APIs
O tipo mais comum hoje em dia. Acede através de URLs HTTP. Exemplos: Twitter API, Stripe API, Google Maps API.
📦 SOAP APIs
Protocolo mais antigo, usa XML. Ainda usado em sistemas empresariais e bancos.
⚡ GraphQL APIs
Query language moderna. Permite pedir exatamente os dados que precisas.
🔌 APIs de Bibliotecas
APIs locais em código. A classe DateTime do PHP é um exemplo.
📡 Protocolo HTTP
O HTTP (HyperText Transfer Protocol) é o protocolo usado para comunicação na web. É a base das APIs REST.
Como Funciona um Pedido HTTP
Componentes do Pedido
| Componente | Descrição | Exemplo |
|---|---|---|
| URL | Endereço do recurso | https://api.exemplo.com/users |
| Método | Ação a executar | GET, POST, PUT, DELETE |
| Headers | Metadados do pedido | Content-Type, Authorization |
| Body | Dados do pedido | JSON com dados |
🔧 Verbos HTTP (Métodos)
Os verbos HTTP indicam a ação que queres executar num recurso. Cada um tem um significado específico.
GET - Obter Dados
- Usado para ler ou obter dados
- Não deve modificar dados (idempotente)
- Parâmetros vão na URL (query string)
- Pode ser cacheado
- Safe - não causa efeitos colaterais
<?php
// GET para obter lista de utilizadores
$url = 'https://api.exemplo.com/users?limit=10';
$response = file_get_contents($url);
$users = json_decode($response, true);
foreach ($users as $user) {
echo $user['name'] . "\n";
}
?>
POST - Criar Dados
- Usado para criar novos recursos
- Dados enviados no body do pedido
- Não é idempotente (múltiplos POSTs criam múltiplos recursos)
- Retorna geralmente o recurso criado com ID
<?php
// POST para criar um novo utilizador
$url = 'https://api.exemplo.com/users';
$data = [
'name' => 'João Silva',
'email' => 'joao@exemplo.com'
];
$options = [
'http' => [
'header' => "Content-type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data)
]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
?>
PUT - Substituir Dados
- Usado para atualizar/substituir um recurso completo
- Idempotente (múltiplas execuções = mesmo resultado)
- Substitui TODOS os campos do recurso
- Requer todos os campos no body
PUT substitui o recurso inteiro. Se só enviares alguns campos, os outros serão apagados!
PATCH - Atualizar Parcialmente
- Usado para atualizar parcialmente um recurso
- Idempotente (depende da implementação)
- Apenas os campos enviados são atualizados
- Os outros campos mantêm-se inalterados
PUT vs PATCH:
- PUT: Substitui todo o recurso
- PATCH: Atualiza apenas os campos enviados
DELETE - Remover Dados
- Usado para remover um recurso
- Idempotente (eliminar o mesmo recurso múltiplas vezes = mesmo resultado)
- Geralmente não tem body
- Pode retornar o recurso eliminado ou status de sucesso
📊 Códigos de Status HTTP
Os códigos de status indicam o resultado do pedido. São agrupados por centenas.
1xx - Informação
100 Continue- Pedido em andamento101 Switching Protocols- Mudança de protocolo
2xx - Sucesso
200 OK- Pedido bem-sucedido201 Created- Recurso criado (POST)204 No Content- Sucesso sem body (DELETE)
3xx - Redireção
301 Moved Permanently- URL mudou302 Found- Redireção temporária304 Not Modified- Cache válido
4xx - Erro do Cliente
400 Bad Request- Pedido inválido401 Unauthorized- Autenticação necessária403 Forbidden- Sem permissão404 Not Found- Recurso não encontrado422 Unprocessable Entity- Dados inválidos429 Too Many Requests- Rate limit excedido
5xx - Erro do Servidor
500 Internal Server Error- Erro genérico502 Bad Gateway- Servidor upstream inválido503 Service Unavailable- Serviço temporariamente indisponível504 Gateway Timeout- Timeout do servidor
📦 Formato JSON
JSON (JavaScript Object Notation) é o formato mais usado para trocar dados em APIs. É leve, legível por humanos e fácil de processar.
Estrutura JSON
{
"id": 1,
"nome": "João Silva",
"email": "joao@exemplo.com",
"ativo": true,
"roles": ["admin", "editor"],
"endereco": {
"rua": "Rua Principal",
"cidade": "Lisboa",
"codigo_postal": "1000-001"
}
}
JSON em PHP
Converter PHP para JSON
<?php
$data = [
'id' => 1,
'nome' => 'João Silva',
'email' => 'joao@exemplo.com',
'ativo' => true,
'roles' => ['admin', 'editor']
];
$json = json_encode($data);
echo $json;
// {"id":1,"nome":"João Silva","email":"joao@exemplo.com",...}
// JSON formatado (legível)
$jsonPretty = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $jsonPretty;
?>
Converter JSON para PHP
<?php
$json = '{"id":1,"nome":"João Silva","email":"joao@exemplo.com"}';
// Para array associativo
$array = json_decode($json, true);
echo $array['nome']; // "João Silva"
// Para objeto stdClass
$objeto = json_decode($json);
echo $objeto->nome; // "João Silva"
// Verificar erros
if (json_last_error() !== JSON_ERROR_NONE) {
echo "Erro ao decodificar JSON: " . json_last_error_msg();
}
?>
Usa sempre json_decode($json, true) para obter um array associativo em vez de um objeto stdClass. É mais fácil de trabalhar em PHP!
🔗 APIs REST
REST (Representational State Transfer) é um estilo arquitetural para APIs que usa HTTP de forma padronizada.
Princípios REST
| Princípio | Descrição |
|---|---|
| Stateless | Cada pedido contém toda a informação necessária. O servidor não guarda estado entre pedidos. |
| Recursos | Tudo é um recurso com um URI único (ex: /users/123). |
| Verbos HTTP | Usa os métodos HTTP corretos: GET, POST, PUT, DELETE. |
| Representações | Recursos podem ter múltiplas representações (JSON, XML). |
| HATEOAS | Hypermedia as the Engine of Application State. Links nas respostas para navegar. |
Exemplo de API REST
GET /api/users # Listar utilizadores
POST /api/users # Criar utilizador
GET /api/users/123 # Obter utilizador específico
PUT /api/users/123 # Atualizar utilizador (completo)
PATCH /api/users/123 # Atualizar utilizador (parcial)
DELETE /api/users/123 # Eliminar utilizador
GET /api/users/123/posts # Posts do utilizador
POST /api/users/123/posts # Criar post para utilizador
GET /api/users/123/posts/456 # Post específico
{
"id": 123,
"nome": "João Silva",
"email": "joao@exemplo.com",
"created_at": "2026-01-15T10:30:00Z",
"_links": {
"self": { "href": "/api/users/123" },
"posts": { "href": "/api/users/123/posts" }
}
}
📝 Exercícios Rápidos
Exercício 1: Identificar Verbo HTTP
Pergunta: Qual verbo HTTP deves usar para criar um novo recurso numa API REST?
Resposta: POST
Explicação: O método POST é usado para criar novos recursos. O servidor recebe os dados no body do pedido, cria o recurso e retorna geralmente o ID do recurso criado junto com o código 201 (Created).
Exercício 2: Código de Status
Pergunta: Se envias um pedido para uma API e recebes o código 401, o que significa?
Resposta: Unauthorized - Não estás autenticado.
Explicação: O código 401 indica que precisas de fornecer credenciais válidas para aceder ao recurso. Deves verificar se estás a enviar o token de autenticação correto nos headers.
Exercício 3: JSON em PHP
Pergunta: Como convertes este JSON para um array PHP?
'{"produto":"Telemóvel","preco":299.99}'
Resposta:
$json = '{"produto":"Telemóvel","preco":299.99}';
$array = json_decode($json, true);
echo $array['produto']; // "Telemóvel"
echo $array['preco']; // 299.99
Exercício 4: PUT vs PATCH
Pergunta: Qual é a diferença entre PUT e PATCH?
Resposta:
- PUT: Substitui o recurso completo. Se só enviares alguns campos, os outros serão removidos/apagados.
- PATCH: Atualiza apenas os campos enviados. Os outros campos mantêm-se inalterados.
Exemplo: Se tens um utilizador com nome, email e idade, e só queres atualizar a idade, usa PATCH. Se usares PUT e não enviares o nome e email, eles serão apagados!