API REST mínima pra cadastrar URLs de destino, disparar um payload HTTP e guardar o histórico com status de sucesso ou falha. Serve pra estudar Slim 4, PHP-DI e chamada HTTP de saída com Guzzle, sem fila e sem worker.
Como microsserviço local (ou Docker) que outros sistemas chamam quando precisam notificar uma URL externa. Útil como peça de portfólio, sandbox de webhooks ou ponto de partida pra evoluir retry/assinatura HMAC depois.
- PHP 8.3 (strict types)
- Slim 4 + slim/psr7
- PHP-DI (autowire)
- Guzzle
- Store JSON em arquivo (
flock) - Docker Compose
- Servidor embutido do PHP (
php -S)
POST /destinos— cadastra URLhttp/httpsPOST /disparos— envia o JSON da URL e grava o resultadoGET /disparos— lista o histórico (mais recente primeiro)- Autenticação por API Key (
Authorization: Bearer …) - Timeout de 5s no disparo (a API não fica presa em destino lento)
- Status
sucessosó em HTTP 2xx; o resto (inclusive timeout) virafalha
cp .env.example .env
docker compose up -d --buildAPI: http://localhost:8081
composer installcp .env.example .envphp -d opcache.enable=0 -S localhost:8081 -t public public/index.php
public/index.php # front controller + container PHP-DI
src/Config/Env.php # leitura simples de .env
src/Middleware/ # Bearer API Key
src/Controllers/ # camada HTTP
src/Services/ # regras + Guzzle
src/Repositories/ # destinos + disparos em JSON
bin/check.php # self-check sem rede
Self-check (sem Docker, sem rede):
composer install
php bin/check.phpGitHub Actions (.github/workflows/ci.yml): composer install + o mesmo check e docker compose build.
Smoke da API (stack no ar, chave padrão dev-secret):
TOKEN='Authorization: Bearer dev-secret'
curl -s -X POST http://localhost:8081/destinos \
-H "$TOKEN" -H 'Content-Type: application/json' \
-d '{"url":"https://httpbin.org/post"}'
curl -s -X POST http://localhost:8081/disparos \
-H "$TOKEN" -H 'Content-Type: application/json' \
-d '{"destino_id":1,"payload":{"evento":"pagamento","id":99}}'
curl -s http://localhost:8081/disparos -H "$TOKEN"Sem Bearer a API responde 401.
| Método | Rota | Body | Efeito |
|---|---|---|---|
POST |
/destinos |
{"url":"https://…"} |
cadastra destino |
POST |
/disparos |
{"destino_id":1,"payload":{…}} |
dispara e loga |
GET |
/disparos |
— | histórico |
Exemplo de resposta de disparo:
{
"id": 1,
"destino_id": 1,
"url": "https://httpbin.org/post",
"payload": {"evento": "pagamento", "id": 99},
"status": "sucesso",
"http_code": 200,
"erro": null,
"criado_em": "2026-08-22 06:22:00"
}MIT