Capítulo 2.5: Rotas da API
Tempo de estudo: 45 minutos
1. O que é uma rota? Uma explicação simples
Imagine que seu controlador (PlanetController
) é um grande centro de escritórios, e cada um de seus métodos (index
, store
, show
) é um departamento que realiza seu trabalho.
Uma Rota (Route) é uma placa de endereço na entrada do edifício. Ela diz:
- "Se alguém chegou ao endereço
/planets
pelo método GET — envie-o para o departamentoindex
(mostrar tudo)." - "Se alguém chegou ao endereço
/planets
pelo método POST com uma encomenda (dados) — envie-o para o departamentostore
(criar novo)."
Sem rotas, nenhuma requisição do mundo exterior encontrará o departamento necessário em seu código. O arquivo principal para essas "placas de endereço" na API é routes/api.php
.
No Laravel 11+, por padrão, não há um "livro de endereços da API". Nós o criamos executando o comando php artisan install:api
. Agora temos o arquivo routes/api.php
— este é o principal centro de controle para todas as rotas da nossa API.
A principal diferença de api.php
para web.php
:
- Prefixo /api: O Laravel adiciona automaticamente
/api
a todas as URLs deste arquivo. A rota/planets
se torna/api/planets
. - "Sem estado" (Stateless): Não há sessões nem cookies aqui, como na web normal. Cada requisição é independente e deve conter todas as informações de autenticação (geralmente um token de API nos cabeçalhos).
2. Caminho do Iniciante: Criando uma rota manualmente
Vamos criar uma única rota manualmente para entender o princípio. Nosso objetivo é fazer com que a URL /api/planets
mostre uma lista de todos os planetas.
Abra routes/api.php
e escreva:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PlanetController; // Indicamos onde está nosso controlador
// (1) (2) (3)
Route::get( '/planets', [PlanetController::class, 'index'] );
// ^ ^ ^
// (Método HTTP) (Endereço URL) (Qual controlador e método chamar)
Vamos analisar esta linha em partes:
Route::get(...)
— dizemos: "Esta rota funciona apenas para requisições GET".'/planets'
— esta é a URL que o Laravel vai escutar. Considerando o prefixo/api
, o endereço completo seráhttp://space-api.test/api/planets
.[PlanetController::class, 'index']
— este é o "destino". Dizemos: "Quando a requisição chegar, encontre a classePlanetController
e chame o métodoindex()
nela".
Agora está tudo conectado! Requisição -> Rota -> Controlador -> Método.
E se precisarmos obter um planeta pelo seu ID? Por exemplo, /api/planets/5
.
// Rota para obter um planeta específico
Route::get('/planets/{planet}', [PlanetController::class, 'show']);
Aqui {planet}
é um "modelo" ou variável. O Laravel entende que neste lugar pode haver qualquer coisa (ID, slug). Então ele passa esse valor para o método show(Planet $planet)
. Essa "mágica", onde o Laravel encontra o planeta pelo ID, é chamada de Route Model Binding.
3. Caminho do Mestre: apiResource
— uma linha para governar todos
Criar cada rota manualmente (para index
, show
, store
, update
, destroy
) é cansativo. Os desenvolvedores do Laravel entendem isso, por isso criaram um poderoso auxiliar — apiResource
.
Apague tudo o que escrevemos e substitua por uma única linha:
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PlanetController;
Route::apiResource('planets', PlanetController::class);
O que esta única linha faz por baixo dos panos? Ela cria automaticamente um conjunto completo de rotas para as operações CRUD padrão que já implementamos no controlador.
Método | URL | Encaminha para o método | Propósito |
---|---|---|---|
GET | /api/planets |
index() |
Obter lista de todos os planetas |
POST | /api/planets |
store() |
Criar novo planeta |
GET | /api/planets/{planet} |
show() |
Mostrar um planeta específico |
PUT/PATCH | /api/planets/{planet} |
update() |
Atualizar um planeta existente |
DELETE | /api/planets/{planet} |
destroy() |
Deletar planeta |
Você pode verificar isso por si mesmo. Execute o comando no terminal:
Você verá uma tabela com todas as rotas criadas. apiResource
é seu melhor amigo para economizar tempo ao criar APIs padrão.
4. Missões especiais e ordem das rotas
E se precisarmos de uma rota não padrão que não está no apiResource
? Por exemplo, obter um planeta aleatório no endereço /api/planets/random
.
Vamos adicioná-la. Mas há uma armadilha mortalmente importante aqui, na qual 9 em cada 10 iniciantes caem.
Ordem incorreta (NÃO FUNCIONA!):
Route::apiResource('planets', PlanetController::class);
Route::get('/planets/random', [PlanetController::class, 'random']); // <-- NÃO FUNCIONARÁ
Route::apiResource
, que criou a rota GET /planets/{planet}
. Quando você requisitar /planets/random
, o Laravel pensará que "random" é o ID do planeta e tentará encontrar no banco de dados um planeta com o ID "random" e você receberá um erro.
Ordem correta (FUNCIONA!):
<?php
use App\Http\Controllers\PlanetController;
use Illuminate\Support\Facades\Route;
// 1. Primeiro declaramos as rotas ESPECÍFICAS
Route::get('/planets/random', [PlanetController::class, 'random']);
// 2. E só depois declaramos as rotas GERAIS com variáveis
Route::apiResource('planets', PlanetController::class);
⚠️ Importante!
Para testar a rota api/planets/random, você precisa adicionar um novo manipulador ao PlanetController:
Regra: Sempre declare rotas mais específicas (como /random
) antes de rotas mais gerais e com parâmetros (como /{planet}
).
5. Agrupamento: Organizando
Quando há muitas rotas, elas podem e devem ser agrupadas.
A. Versionamento da API
Para não quebrar futuras aplicações que usam sua API, é comum adicionar uma versão na URL, por exemplo /api/v1/...
.
<?php
Route::prefix('v1')->group(function () {
// Todas as rotas dentro deste grupo receberão o prefixo /v1
// URL final: /api/v1/planets
Route::get('/planets/random', [PlanetController::class, 'random']);
Route::apiResource('planets', PlanetController::class);
});
B. Proteção de rotas (Middleware) Imagine que qualquer um pode ver os planetas, mas criar, atualizar e deletar — apenas usuários autorizados.
<?php
// Rotas públicas, acessíveis a todos
Route::get('/planets', [PlanetController::class, 'index']);
Route::get('/planets/{planet}', [PlanetController::class, 'show']);
// Grupo de rotas que requer "passe" (autenticação)
Route::middleware('auth:sanctum')->group(function () {
Route::post('/planets', [PlanetController::class, 'store']);
Route::put('/planets/{planet}', [PlanetController::class, 'update']);
Route::delete('/planets/{planet}', [PlanetController::class, 'destroy']);
});
Aqui middleware('auth:sanctum')
é como um guarda que verifica o "passe" de todos que tentam acessar as rotas dentro do grupo.
6. Testando via Postman
Agora que todas as rotas foram definidas, é hora de testá-las.
- Se você usa o Herd: Seu site já está funcionando em um endereço como
http://space-api.test
. - Se não: Inicie o servidor local com o comando
php artisan serve
. O endereço seráhttp://localhost:8000
.
Abra o Postman e envie as requisições:
GET http://space-api.test/api/planets
GET http://space-api.test/api/planets/random
POST http://space-api.test/api/planets
(não se esqueça de adicionar o corpo da requisição JSON na abaBody
->raw
->JSON
).
Exemplo de requisição POST:
{
"name": "Kepler-186f",
"description": "Primeiro planeta do tamanho da Terra na zona habitável",
"size_km": 15000,
"solar_system": "Kepler-186",
"is_habitable": true
}
8. Erros comuns de roteamento
- 404 Não Encontrado
- URL incorreta (
/api/planet
em vez de/api/planets
) - Esqueceu
php artisan serve
- 405 Método Não Permitido
- Método HTTP incorreto (por exemplo, GET em vez de POST)
- Controlador Ausente
- Erro de digitação no nome do controlador (
PlanetControler
) - Colisão de Nome de Rota
- Nomes de rota duplicados
Quiz para Fixação
🚀 Resumo do Capítulo:
Você construiu as "rotas hiperespaciais" para a API espacial! Agora:
- 🗺️ Todos os endpoints estão acessíveis via
/api/...
- 🔗 Rotas de recurso estão conectadas ao controlador
- 🛡️ Rotas personalizadas para operações especiais foram adicionadas
- ✅ Rotas testadas via Postman
O universo está aberto para requisições! A seguir, adicionaremos proteção contra "lixo espacial" — a validação de dados.
📌 Verificação:
- Execute
php artisan route:list
- Certifique-se de ver 5+ rotas para planets
- Verifique o funcionamento de GET /api/planets no navegador/Postman
⚠️ Se erro 404:
- Verifique a existência de
Route::apiResource
emroutes/api.php
- Certifique-se de que o servidor está em execução (
php artisan serve
)- Para Windows: permita a porta 8000 no firewall