Atividade 09: HTTP e Comunicação de Dados
Contexto
Seção intitulada “Contexto”Na Atividade 08 você evoluiu a API de produtos para persistir os dados com Spring Data JPA e banco H2, expondo endpoints como POST /produtos, GET /produtos e GET /produtos/{id}.
Nesta atividade, vamos usar essa mesma API para explorar, na prática, os conceitos dos Tópicos 11 (Protocolo HTTP) e 12 (Comunicação de Dados): representações de um recurso, cabeçalhos, status codes, cookies, cache, serialização/desserialização e Object Mapping com o Jackson.
A atividade tem duas partes: Parte A com exercícios teóricos e Parte B com um exercício de implementação sobre a API da Atividade 08.
Parte A - Exercícios teóricos
Seção intitulada “Parte A - Exercícios teóricos”Exercício A1 - Múltipla escolha (métodos HTTP)
Seção intitulada “Exercício A1 - Múltipla escolha (métodos HTTP)”Assinale a alternativa correta em cada item.
-
Qual método HTTP é seguro e idempotente?
- a)
POST - b)
PUT - c)
GET - d)
PATCH
- a)
-
Sobre
PUTePATCH, é correto afirmar que:- a) ambos substituem o recurso inteiro;
- b)
PUTsubstitui o recurso por completo ePATCHaltera parte dele; - c)
PUTaltera parte do recurso ePATCHsubstitui por completo; - d) ambos são idempotentes e seguros.
-
Qual método normalmente não é idempotente?
- a)
GET - b)
POST - c)
DELETE - d)
HEAD
- a)
Exercício A2 - Escolha do status code
Seção intitulada “Exercício A2 - Escolha do status code”Para cada situação, indique o código de status HTTP mais adequado (200, 201, 204, 400, 401, 403, 404 ou 500):
- Um produto foi criado com sucesso por meio de um
POST. - Um recurso foi removido com sucesso e não há corpo na resposta.
- O cliente enviou um JSON com um campo obrigatório ausente.
- A requisição não trouxe um token de autenticação válido.
- O usuário está autenticado, mas não tem permissão para acessar a rota.
- O
GET /produtos/{id}foi chamado com umidque não existe. - Ocorreu um erro inesperado no servidor durante o processamento.
Exercício A3 - Content-Type x Accept
Seção intitulada “Exercício A3 - Content-Type x Accept”Explique, com suas palavras, a diferença entre os cabeçalhos Content-Type e Accept. Dê um exemplo de requisição em que os dois aparecem com valores diferentes e justifique.
Exercício A4 - Verdadeiro ou falso (JSON)
Seção intitulada “Exercício A4 - Verdadeiro ou falso (JSON)”Marque V ou F e justifique as falsas.
- ( ) No JSON, as chaves são sempre strings entre aspas duplas.
- ( ) O JSON possui um tipo de dado nativo para datas.
- ( ) Um vetor em JSON é delimitado por
[ ]. - ( ) O JSON permite funções como valor.
- ( )
null,truee números são tipos válidos em JSON.
Exercício A5 - Analisando JSON inválido
Seção intitulada “Exercício A5 - Analisando JSON inválido”Os trechos abaixo não são JSON válidos. Aponte o erro de cada um e escreva a versão corrigida.
{ 'nome': 'Mouse Gamer', 'preco': 149.90 }{ "nome": "Mouse Gamer", "categorias": ["periféricos", "acessórios", ] }{ "nome": "Mouse Gamer" "preco": 149.90 }Exercício A6 - Discursiva (stateless e cookies)
Seção intitulada “Exercício A6 - Discursiva (stateless e cookies)”O HTTP é considerado um protocolo sem estado (stateless). Explique o que isso significa e descreva como cookies e sessões permitem que uma aplicação “lembre” do estado do cliente entre requisições. Cite o papel dos cabeçalhos Set-Cookie e Cookie.
Exercício A7 - Discursiva (cache HTTP)
Seção intitulada “Exercício A7 - Discursiva (cache HTTP)”Descreva o funcionamento do cache HTTP com ETag. Em sua explicação, inclua:
- o papel do
ETagna resposta; - o cabeçalho
If-None-Matchna requisição seguinte; - por que o servidor pode responder
304 Not Modified; - a vantagem desse mecanismo em termos de banda e latência.
Exercício A8 - Discursiva (serialização e Object Mapping)
Seção intitulada “Exercício A8 - Discursiva (serialização e Object Mapping)”Explique a diferença entre serialização e desserialização e o que é Object Mapping. Dê um exemplo de fluxo em que um objeto Java é convertido em JSON e outro em que um JSON recebido vira um objeto Java.
Exercício A9 - Pesquisa
Seção intitulada “Exercício A9 - Pesquisa”Pesquise e produza um pequeno resumo (meia página cada) sobre:
- JSON, XML e YAML: características, vantagens e um cenário de uso típico para cada um.
- JSON Schema e XSD: o que são e para que servem.
- Atributos de cookie
HttpOnly,SecureeSameSite: o que cada um protege.
Exercício A10 - Associação (anotações Jackson)
Seção intitulada “Exercício A10 - Associação (anotações Jackson)”Relacione cada anotação do Jackson à sua finalidade:
| Anotação | Finalidade |
|---|---|
@JsonProperty |
( ) Oculta um campo da serialização |
@JsonIgnore |
( ) Define o formato de datas/números |
@JsonFormat |
( ) Renomeia a chave usada no JSON |
@JsonInclude |
( ) Controla a inclusão de campos nulos/vazios |
Parte B - Exercício de implementação
Seção intitulada “Parte B - Exercício de implementação”Nesta parte, você deve alterar a API de produtos persistida na Atividade 08. Mantenha a persistência com H2 e a estrutura com entidade, repositório e controller.
Exercício B1 - Um recurso, várias representações
Seção intitulada “Exercício B1 - Um recurso, várias representações”Faça a API responder o mesmo recurso em formatos diferentes, conforme o cabeçalho Accept.
Requisitos
Seção intitulada “Requisitos”-
Crie um endpoint
GET /produtos/{id}/resumoque devolva um texto (text/plain), por exemplo:Produto: Mouse Gamer - preço: R$ 149,90 -
Faça o endpoint
GET /produtos/{id}responder emapplication/jsoneapplication/xmlusandoproduces. -
Adicione a dependência
jackson-dataformat-xmlao projeto. -
Crie um endpoint
GET /produtos/{id}/htmlque devolva uma página HTML simples com os dados do produto (text/html). -
Garanta que o cabeçalho
Content-Typeda resposta corresponda ao formato retornado.
@GetMapping(value = "/{id}", produces = { MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE })public Produto buscar(@PathVariable UUID id) { return produtoRepository.findById(id).get();}Exercício B2 - Object Mapping com Jackson
Seção intitulada “Exercício B2 - Object Mapping com Jackson”Explore como o Jackson transforma os objetos da sua API em JSON.
Requisitos
Seção intitulada “Requisitos”- Adicione à entidade
Produtoos campos:categoria(String),dataCadastro(LocalDate) epromocao(Boolean). - Deixe
promocaocomonullem alguns registros e use@JsonInclude(JsonInclude.Include.NON_NULL)para que o campo não apareça no JSON quando nulo. - Use
@JsonFormatpara padronizardataCadastro(ex.:yyyy-MM-dd). - Renomeie um campo no JSON com
@JsonProperty(ex.:preco→price). - Use
@JsonIgnoreem um campo interno e comprove que ele não aparece na resposta. - Salve a resposta JSON antes e depois das anotações e explique o efeito de cada uma.
Exercício B3 - Inspecionando requisições no Postman/Insomnia
Seção intitulada “Exercício B3 - Inspecionando requisições no Postman/Insomnia”Usando o Postman ou o Insomnia, monte e analise as requisições da API.
Requisitos
Seção intitulada “Requisitos”- Para cada endpoint dos exercícios anteriores, monte uma requisição na ferramenta.
- Altere o cabeçalho
Accept(application/jsoneapplication/xml) e observe as respostas. - Envie um
GET /produtos/{id}com um id inexistente e registre o status code. - Envie um
POST /produtoscom corpo inválido (ex.: semnome) e registre o status. - Registre, para cada requisição:
- Método e URL;
- Cabeçalhos de requisição (
Accept,Content-Type); - Status code da resposta;
- Cabeçalho
Content-Typeda resposta; - Um trecho do corpo da resposta.
Exercício B4 - Desafio: cookies, cache e XML
Seção intitulada “Exercício B4 - Desafio: cookies, cache e XML”Requisitos
Seção intitulada “Requisitos”- Crie um endpoint que defina um cookie com o cabeçalho
Set-Cookie(ex.:ultimoProduto=...). - Crie um endpoint que responda com
Cache-ControleETag, permitindo a validação condicional (If-None-Match→304 Not Modified). - Envie um
POST /produtoscomContent-Type: application/xmle um corpo XML, fazendo o Spring desserializar o XML em um objeto. - Documente, com prints do Postman/Insomnia, o comportamento observado em cada caso.
Entrega esperada
Seção intitulada “Entrega esperada”- Parte A: respostas dos exercícios teóricos.
- Parte B: código-fonte da API atualizada e prints das requisições/respostas no Postman/Insomnia.
- Uma pequena tabela relacionando endpoint, método, status e
Content-Typeobservados.