3. Conclusão e Próximos Passos
Nesta aula vimos que uma API REST segue um conjunto de padrões baseados no protocolo HTTP, permitindo a comunicação entre sistemas de maneira padronizada, previsível e escalável. Para garantir que uma API seja realmente RESTful, entendemos a importância do modelo de maturidade de Richardson, que nos ajuda a avaliar a conformidade de uma API com os princípios REST.
Além disso, iniciamos a introdução ao Spring Boot, uma tecnologia que simplifica o desenvolvimento de aplicações Java, eliminando a necessidade de configurações manuais complexas e permitindo que possamos rapidamente criar e expor endpoints RESTful. Aprendemos a estrutura de um projeto Spring Boot e implementamos os principais componentes necessários para a construção de uma API de lista de contatos.
Nas próximas aulas avançaremos na construção de APIs mais robustas e completas. Trabalharemos com novos conceitos essenciais para um desenvolvimento profissional, incluindo:
🔹 Validações e Tratamento de Erros: Garantindo que nossa API retorne respostas consistentes e evite entradas inválidas.
🔹 Persistência e Banco de Dados: Integração da API com um banco de dados real para armazenar os contatos de forma permanente.
🔹 Autenticação e Segurança: Protegendo a API com mecanismos de autenticação, como OAuth e JWT.
🔹 Boas Práticas e Documentação: Como tornar nossa API mais compreensível e fácil de usar para outros desenvolvedores.
Antes disso, entretanto, é necessário solidificar os conteúdos vistos até aqui.
4. Exercícios
Os exercícios a seguir têm como objetivo reforçar os conceitos apresentados na aula e permitir que você pratique o desenvolvimento de APIs REST com Spring Boot.
📌 Instruções:
- Os exercícios devem ser entregues no Moodle dentro do prazo estipulado.
- Sempre comente o código explicando as principais partes da implementação.
- Utilize Postman, Insomnia ou cURL para testar os endpoints criados.
- O código-fonte deve ser enviado em um repositório no GitHub (ou em anexo no Moodle, se preferir).
1️⃣ Exercício 1 - Criando um Novo Endpoint GET
Crie um novo endpoint GET em ContactController que permita buscar contatos pelo nome.
📌 Requisitos:
- O método deve receber o nome como um parâmetro de URL (
/api/contacts/search?name=João). - O método deve retornar uma lista de contatos que correspondam ao nome fornecido.
- Caso nenhum contato seja encontrado, retorne uma lista vazia.
📌 Dicas:
- Você pode precisar modificar a interface
ContactRepositorypara adicionar um método de busca personalizada.
📝 Saída esperada (JSON):
[
{
"id": 1,
"nome": "João Silva",
"telefone": "9999-9999",
"email": "joao@email.com"
}
]
2️⃣ Exercício 2 - Implementando um Método PATCH
Adicione um novo método PATCH à API, permitindo que o usuário atualize apenas um ou mais campos de um contato, sem precisar enviar todos os dados.
📌 Requisitos:
- O método deve permitir alterar apenas os campos enviados na requisição.
- Se o campo não for enviado, o valor original deve ser mantido.
- Retorne o contato atualizado após a alteração.
- Caso o ID fornecido não exista, retorne um erro 404.
📌 Exemplo de chamada:
PATCH /api/contacts/1
{
"email": "novoemail@email.com"
}
📝 Saída esperada (JSON):
{
"id": 1,
"nome": "João Silva",
"telefone": "9999-9999",
"email": "novoemail@email.com"
}
3️⃣ Exercício 3 - Comparando REST e SOAP
Agora que você já conhece APIs REST, faça uma pesquisa sobre APIs SOAP e responda às perguntas abaixo com suas próprias palavras.
📌 Questões:
- Qual a principal diferença entre REST e SOAP?
- Em quais cenários SOAP ainda é amplamente utilizado?
- Quais são as vantagens e desvantagens de usar REST ao invés de SOAP?
- O que é WS-Security e como ele se compara à segurança em APIs REST?
- Explique o modelo de maturidade de Richardson e em que nível SOAP se encaixa.
1️⃣ Desafio 1 - Criando um Novo Modelo de Dados**
Atualmente, nossa API gerencia apenas contatos. Agora, queremos adicionar um novo recurso: endereços.
📌 Tarefas:
- Crie uma nova entidade
Address, com os seguintes atributos:id(Long, auto-increment)rua(String)cidade(String)estado(String)cep(String)contactId(Long) - Chave estrangeira referenciando um contato.
- Crie uma relação bidirecional entre contatos e endereços.
- Crie um repositório (
AddressRepository) para gerenciar os endereços. - Implemente um novo
AddressControllerpara adicionar e recuperar endereços. - Crie uma rota GET
/api/contacts/{id}/addressespara listar todos os endereços de um contato específico.
2️⃣ Desafio 2 - Melhorando a Validação dos Dados
Atualmente, nossa API aceita qualquer valor no cadastro de contatos. Precisamos garantir que os dados sejam válidos antes de inseri-los no banco de dados.
📌 Requisitos:
- Adicione validações à entidade
Contact, utilizando a anotação@Valid. - Implemente regras como:
- O campo
nomenão pode estar vazio. - O campo
emaildeve ter um formato válido (@Email). - O campo
telefonedeve ter no mínimo 8 e no máximo 15 caracteres.
- O campo
📌 Exemplo de resposta para entrada inválida:
Se tentarmos criar um contato com um telefone inválido:
{
"nome": "Maria",
"telefone": "123",
"email": "maria@email.com"
}
A API deve retornar HTTP 400 e uma mensagem de erro:
{
"erro": "O telefone deve ter entre 8 e 15 caracteres"
}
📌 Instruções Finais
- ✅ Para os exercícios práticos (1 e 2) a entrega esperada é o código das novas rotas e prints das requisições no Postman ou Insomnia. Envie um link do GitHub ou um arquivo .zip com o código-fonte.
- ✅ Para o exercício teórico (3), envie um arquivo .pdf ou .txt com as respostas.
- ✅ A entrega dos desafios terá um prazo estendido até o Domingo posterior à data de entrega dos exercícios, também devendo ser entregue o código de implementação e os prints dos testes.
- ✅Teste todas as funcionalidades antes de enviar e garanta que o código está funcionando.