REST API desenvolvida em Python para consultar previsões meteorológicas do Instituto Português do Mar e da Atmosfera (IPMA).
Aplicação que permite consultar previsões meteorológicas para qualquer localidade em Portugal através de uma API RESTful simples. Os dados são obtidos em tempo real da API pública do IPMA.
Inclui interface web para testes (sem necessidade de Postman)!
- Consulta de previsões por localidade e distrito
- Parâmetros dinâmicos via API (sem alterar código)
- Interface web interativa para testes
- Suporte completo para Docker
- API REST com CORS habilitado
- Python 3.9
- Flask (Framework web)
- Flask-CORS (Suporte CORS)
- Requests (Comunicação HTTP)
- Gunicorn (Servidor produção)
- Docker & Docker Compose
git clone https://github.com/seu-usuario/semple_api_Weather.git
cd semple_api_Weather
docker-compose up -dAcesse: http://localhost:5000
git clone https://github.com/seu-usuario/semple_api_Weather.git
cd semple_api_Weather
./install.sh
./run.shAbra no navegador: http://localhost:5000/index.html
A interface permite:
- Listar todos os distritos de Portugal
- Filtrar localidades por distrito
- Consultar previsões meteorológicas
- Testar todos os endpoints sem Postman
GET http://localhost:5000/distritosExemplo:
curl http://localhost:5000/distritosResposta:
{
"sucesso": true,
"total": 29,
"distritos": [
{"id": 1, "nome": "Aveiro"},
{"id": 11, "nome": "Lisboa"},
{"id": 13, "nome": "Porto"}
]
}GET http://localhost:5000/localidades
GET http://localhost:5000/localidades?distrito_id=11Exemplos:
# Todas as localidades
curl http://localhost:5000/localidades
# Apenas Lisboa
curl http://localhost:5000/localidades?distrito_id=11Resposta:
{
"sucesso": true,
"total": 45,
"localidades": [
{
"id": 1110600,
"nome": "Lisboa",
"distrito_id": 11,
"distrito_nome": "Lisboa",
"latitude": "38.71",
"longitude": "-9.14"
}
]
}GET http://localhost:5000/previsao/{localidade_id}
GET http://localhost:5000/previsao/{localidade_id}?dias=3Exemplos:
# Previsão para Lisboa (5 dias)
curl http://localhost:5000/previsao/1110600
# Previsão para Porto (3 dias)
curl http://localhost:5000/previsao/1131200?dias=3Resposta:
{
"sucesso": true,
"dados": {
"localidade_id": 1110600,
"total_dias": 3,
"previsoes": [
{
"data": "2025-10-04",
"temperatura_minima": 15.0,
"temperatura_maxima": 24.0,
"probabilidade_precipitacao": 10.0,
"vento_velocidade": 15.0,
"vento_direcao": "N",
"humidade_relativa": 70,
"descricao_tempo": "Céu pouco nublado"
}
]
}
}| Cidade | ID | Distrito |
|---|---|---|
| Lisboa | 1110600 | 11 |
| Porto | 1131200 | 13 |
| Coimbra | 1060300 | 6 |
| Faro | 1080500 | 8 |
| Braga | 1030300 | 3 |
| Aveiro | 1010500 | 1 |
Dica: Use a interface web ou endpoint /localidades para encontrar IDs de outras cidades.
semple_api_Weather/
├── app.py # API Flask principal
├── config.py # Configurações
├── index.html # Interface web de testes
├── services/
│ └── ipma_service.py # Serviço IPMA
├── requirements.txt # Dependências Python
├── Dockerfile # Imagem Docker
├── docker-compose.yml # Orquestração
├── install.sh # Script instalação
└── run.sh # Script execução
# Iniciar
docker-compose up -d
# Ver logs
docker-compose logs -f
# Parar
docker-compose down
# Reconstruir
docker-compose up -d --buildA API retorna erros em JSON com códigos HTTP apropriados:
| Código | Descrição |
|---|---|
| 200 | Sucesso |
| 400 | Parâmetros inválidos |
| 404 | Recurso não encontrado |
| 500 | Erro interno |
| 503 | Serviço indisponível |
Exemplo de erro:
{
"erro": "Previsão não encontrada",
"mensagem": "Não foi possível obter a previsão para a localidade 999999"
}Abra: http://localhost:5000/index.html
curl http://localhost:5000/distritos
curl http://localhost:5000/previsao/1110600Acesse diretamente:
- http://localhost:5000/distritos
- http://localhost:5000/localidades?distrito_id=11
- http://localhost:5000/previsao/1110600
Importe os endpoints e teste conforme necessário.
docker-compose up -dgunicorn -w 4 -b 0.0.0.0:5000 app:appEdite o ficheiro .env:
FLASK_APP=app.py
FLASK_ENV=production
PORT=5000✅ Recolhe dados da API do IPMA
✅ REST API funcional com 4 endpoints
✅ Parâmetros dinâmicos (distrito/localidade via API)
✅ Estrutura organizada e bem documentada
✅ Disponível no GitHub
✅ BÓNUS: Docker completo
✅ EXTRA: Interface web para testes sem Postman
Porta 5000 em uso:
# Edite .env e mude a porta
PORT=8000Docker não inicia:
docker-compose down
docker-compose up -d --buildCORS Error no frontend: Certifique-se que a API está rodando em http://localhost:5000
Código aberto - disponível para uso educacional e comercial.
Desenvolvido como projeto de demonstração de REST API com integração de dados externos.

