🌐 O que é uma API?

💡 Definição

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

Cliente (PHP)
→
Pedido HTTP
→
Servidor API
Cliente (PHP)
←
Resposta HTTP
←
Servidor API

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

GET /api/users
  • 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
Exemplo em PHP
<?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

POST /api/users
  • 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
Exemplo em PHP
<?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

PUT /api/users/123
  • 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
⚠️ Atenção

PUT substitui o recurso inteiro. Se só enviares alguns campos, os outros serão apagados!

PATCH - Atualizar Parcialmente

PATCH /api/users/123
  • 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

DELETE /api/users/123
  • 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 andamento
  • 101 Switching Protocols - Mudança de protocolo
2xx - Sucesso
  • 200 OK - Pedido bem-sucedido
  • 201 Created - Recurso criado (POST)
  • 204 No Content - Sucesso sem body (DELETE)
3xx - Redireção
  • 301 Moved Permanently - URL mudou
  • 302 Found - Redireção temporária
  • 304 Not Modified - Cache válido
4xx - Erro do Cliente
  • 400 Bad Request - Pedido inválido
  • 401 Unauthorized - Autenticação necessária
  • 403 Forbidden - Sem permissão
  • 404 Not Found - Recurso não encontrado
  • 422 Unprocessable Entity - Dados inválidos
  • 429 Too Many Requests - Rate limit excedido
5xx - Erro do Servidor
  • 500 Internal Server Error - Erro genérico
  • 502 Bad Gateway - Servidor upstream inválido
  • 503 Service Unavailable - Serviço temporariamente indisponível
  • 504 Gateway Timeout - Timeout do servidor

📦 Formato JSON

💡 O que é 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

Exemplo de 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 Array → 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

JSON → PHP Array
<?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();
}
?>
💡 Dica

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

Endpoints RESTful
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
📝 Exemplo de Resposta REST
{
  "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!