Um momento
Aula 13
Cursos / Como Criar uma API JSON em Golang - CRUD Simples
Rota para Modificar um Livro - Golang API JSON - CRUD Simples

Nesta aula criamos a rota PUT /livros/{livroId} para modificar um livro.

Extraímos o id do livro da rota. Não se esqueça de convertê-lo de string para int.

Antes de modificar um livro, precisamos verificar a sua existência. Procuramos pelo livro usando a estrutura repetição "for". Se o livro não existir, enviamos 404 Status Not Found na resposta HTTP.

Se o livro existir, podemos iniciar o processo de modificação. Primeiro, temos que ler o corpo da requisição de HTTP para saber dos novos dados para o livro. Segundo, temos que atualizar a lista de livros com o livro modificado.

Para ler o corpo da requisição, acessamos o r.Body. O pacote ioutil tem o método ReadAll, que é útil para ler o corpo da requisição.

A próxima etapa é decodificar os dados do livro que foi fornecido pela requisição. O formato dos dados é JSON, então usamos o método json.Unmarshal para associar os valores à uma variável do tipo Livro.

Quando fizemos a busca pelo livro para ver se o mesmo existe, armazenamos o seu índice. Com esse índice, podemos substituir os dados do Livro com o livroModificado.

Note que nessa aula não fazemos nenhuma validação de entrada. Isto é, os valores em formato JSON fornecido pelo cliente não são testados para ver se todos os campos requeridos foram fornecidos, se os seus valores são válidos, etc.

Depois de atualizar a lista de livros, enviamos como resposta para o cliente os dados do livro modificado. Basta criar um codificador JSON and codificar o livro modificado:

json.NewEncoder(w).Encode(livroModificado)

Summary

# Resumo da Aula de Golang: Modificação de Livro na API JSON

## Introdução
- A aula foca em implementar uma rota para modificar um livro em uma API JSON.
- A implementação utilizará conceitos já aprendidos nas rotas de exclusão e cadastro.

## Implementação da Rota PUT
1. **Roteamento**:
   - A rota será configurada para responder a requisições `PUT` na URL `/livros/{id}`.
   - O método `PUT` é usado para atualizar um livro específico, indicado pelo `id`.

2. **Função `modificarLivro`**:
   - Recebe dois parâmetros: `w` (ResponseWriter) e `r` (requisição HTTP).
   - Extraí o `id` da URL usando `strings.Split`.
   - Converte o `id` de string para inteiro utilizando `strconv.Atoi`.
   - Se houver um erro durante a conversão, retorna um HTTP status `400 Bad Request`.

3. **Verificação da Existência do Livro**:
   - Percorre a lista de livros em busca do livro com o `id` fornecido.
   - Se não encontrar, retorna um HTTP status `404 Not Found`.

4. **Modificação do Livro**:
   - Se o livro é encontrado, lê o corpo da requisição para obter os dados do livro modificado.
   - Usa `io.ReadAll` para ler o corpo da requisição.
   - Decodifica o JSON recebido em uma estrutura `Livro`.
   - Se ocorrer um erro na decodificação do JSON, retorna um HTTP status `400 Bad Request`.

5. **Resposta**:
   - Atualiza o livro na lista.
   - Retorna o livro modificado como uma resposta JSON com um status `200 OK`.

## Testes
- Através do Postman, foram realizados testes para verificar:
  - Se o livro foi modificado corretamente com um `PUT` válido.
  - O que acontece ao enviar um `PUT` com um `id` inválido.
  - Respostas para erros de requisições mal formadas, como JSON inválido.

## Observações Finais
- É importante validar a lógica de atualização e considerar a possibilidade de mesclar dados se o `id` do livro não for enviado corretamente.
- A aula concluiu destacando melhorias que podem ser feitas para gestão de erros e validação de entrada. 

**Próxima Aula**: Aprofundamento em melhorias e manuseio de erros.

Video Transcript

Vamos lá pessoal, estamos de volta com mais uma aula de Golang, vamos continuar a nossa implementação da API JSON um curso de síntetos, vamos lá! Acabamos de fazer a rota para excluir um livro e agora vamos finalizar com uma rota para modificar um livro vai ser bem simples, vai usar elementos que a gente já aprendeu não excluir e cadastrar, né? Então vamos lá, vou lá para aquela função onde tem o roteamento, vou aqui no rotear livros, quando bater no barra livros barra alguma coisa, vai vir aqui aí nós vamos verificar aquela mesma coisa, né? Aquela rota do barra livros barruí, dedo-livro que vai bater nesta elsa, caso do elsef aqui já temos o get que vai fazer o buscar a livros, temos o delete, agora vamos adicionar o put, tá? elsef, o r.method, o método r, equisizão for put, significa que a gente quer atualizar o livro que o JUD foi especificado na URL então vamos adicionar uma nova função aqui, por exemplo modificar o livro, vamos passar como argumento w, w, w, response writer, w, e r, o ponteiro para HTTP request aqui vou aqui em cima adicionar funk, modificar o livro, w, HTTP, response writer, r, ponteiro para HTTP request bem, ok, o que a gente vai fazer agora? Aquela mesma coisa, primeiro precisamos extrair o id da rota, então partes, dois pontos igual, strings, pontos splits e aqui está o path, no r, rl, path, vamos quebrar string na barra, vamos converter aquele, pegar o id que está na parte de sub dois, vamos converter a strcon, patoi para converter a string para int finalmente vamos pegar o id vir o erro, variáveis, se dá erro, o erro não for new, dê um problema aqui, a gente faz o que? w, write header para poder mandar uma resposta com o código de HTTP, os status de HTTP, status, bad request e retorna para não poder mais continuar o código se tudo dá certo o id foi convertido de string para int, com sucesso, com êxito, a gente continua aqui, pronto, já temos o id agora, vamos fazer o que? a gente precisa modificar o livro, será que o livro existe na lista? vamos fazer um loop na lista, vou fazer aquela mesma coisa e vou fazer uma variável para poder armazenar o índice do livro na lista então vou fazer essa variável aqui, índice do livro, vou atribuir o valor menos um, que significa que ainda não foi contrado, não dá o loop for, índice vírgula, livro, dois pontos igual range e o nome da variável da lista de livros, livros então esse loop para cada repetição, vamos checar, se o id do livro, presente, foi igual ao id que você deu na rota, um parâmetro, se isso for o mesmo, significa que encontrarmos o livro, então vou associa o índice do livro a esse índice aqui pronto, depois disso a gente pode dar o break no loop para terminar, para não poder ficar fazendo repetição, porque a gente já achou o livro com isso, depois disso a gente vai checar, será que encontrou o livro depois de fazer todas as repetições? será que ele setou o valor de índice do livro para outra coisa que não seja menos um? vamos ver se o índice do livro, e eu põe parênteses porque eu só costumava a JavaScript e a outra linguagem, assim índice do livro, for, menor que zero, isso é, o valor negativo, menos um, significa que não achamos o livro, então não podemos modificar algo que não existe então vamos dar o, not found, w.uk, write, error, http.status, not found, não encontrar e dar o return para poder parar de não fazer mais nenhum código, o seguinte pronto, depois isso pode se chegar na linha 115, significa que encontrou o livro, o bem, o que é que vamos fazer? bem simples, se você pega a lista de livros, no índice do livro, igual o livro modificado, que a gente ainda não tem, esquecemos dentro da tarde quando você quiser modificar um livro, você tem que passar no corpo da requisição do pedido, http, os dados atualizados, você quer atualize o livro, eu chamei de livro modificado, então como a gente vai ler essa variável lá do corpo? vamos aqui lá em cima, voltar um pouco então além do id precisamos também o quê? na linha 97 precisamos extrair o corpo, se lembra como fazer isso na função de carastrar, então o r.bar tem o corpo do pedido, http, nós vamos usar o yaw util.readall, se lembra? então yaw util, o pacote, method.readall, vamos passar o r.bar, esse método aqui, vai retornar o corpo e o erro, vamos ver aqui o negócio que a gente fez antes de carastrar o livro, se lembra aqui? tá, então o corpo e um erro aqui, nós que temos dois erros, porque eu botei tudo numa mesma função, se você quiser repatorizar e extrair cada parte pra uma função diferente, então vou dizer, bora e erro o erro corpo e eu vou mudar isso pra cima, que esse erro que é o do id, não é o do corpo, depois de pegar o id, tudo certo, vamos lá pro corpo, yaw util, ler do body, põe no corpo, se der erro, porque o erro de leitura, alguma coisa aconteceu, o erro corpo, não por nil, talvez sei lá na hora da leitura deu problema, w.write header, algum http, qual será o status aqui? Bem, quais problemas pode acontecer? Ainda não estamos na parte do json, então não pode ser problema de decodificamento do json, o que é só negócio string e a rate byte, né? não sei qual seria, sei lá, vou botar internal, server error aqui, tem você que sabe, só confirmar que o nome da constante tá certo, navegador, site do holland, gttp tá certo, 500, voltando ao editor de texto, então se der algum problema no error do corpo, mandar esse erro aqui, se não deu tudo certo, temos o corpo, mas temos que converter isso pra um format json, temos que decodificar para um struct, então fazer isso, vou criar um variável, um livro modificado do tipo livro, vou chamar o que? Vou chamar o json.onmarchal, vou passar o corpo e quero que você decodifique pra variável de livro modificado, então eu vou pegar o corpo aqui, que é uma fatia de byte, e vai decodificar aqui, pra essa struct aqui, livro modificado, certo? E com isso a gente obtém o livro, pode ser até que o onemarcha tenha erro também, deixa eu ver, vamos lá no documentação, pkg, cadê o json encoder, barra, json index, decoder, não é onemarchal né, onemarchal, ah, retorno erro, então pode até ser que tenha um erro aqui, erro json, vou chamar, se der erro json, tanto erro né pra ver, se o erro json não for neer isto, deu erro na decodificação do json, você vai passar a double, right header, pode ser bad request, talvez o usuário digitou o json errado, sem ser formatado corretamente, dá o return pra não poder mais executar mais nada, tá bom? Que tal a gente testar isto? Vamos aqui no postman, deixa o reiniciar o servidor, ah, índice do livro indefinido, linha 117, esqueci dois pontos, tá aí, reiniciar o servidor, vamos dar o get dos livros primeiro, temos três livros, vamos dar o livro cujo id é dois, a título é casus, viriato, vamos mudar pra outra coisa, vou abrir o nova aba, vou mudar o verbo para put, livros barra dois, tá, livros barra dois, aí pro corpo vai aqui no body, raw, em vez de texto json, abra chaves, não se esqueça das aspas, qual era a título, sei lá, novo livro, auto, eu mesmo, tá bom? Vamos mandar o put, 200 ok, não tem nenhum resposta, não esqueçamos, não botou ainda, não escrevemos a resposta, mas vamos ver aqui no get, se realmente modificou, então, mudou aqui o título e auto, novo livro eu mesmo, not that the id virou zero, porque na hora de fazer o decodificação, o id não foi passado aqui, como a gente não tem validação, ele aceita qualquer coisa, nós não temos o id aqui no corpo, se tivesse ia manter, id dois, isso é umas coisas detalhes que a gente, que você pode ver aí, então vamos continuar voltando aqui e adicionar a resposta, normalmente pro put, você responde com o livro modificado, depois de fazer a atualização da lista, vamos mandar o livro modificado, vai fazer o que, json, new encoder, criar um novo codificador com o w, você pode usar aqui já tá o ponto aqui de novo, que isso aqui retorna um encodificador e do encodificador chama o método encode com o livro modificado, ele vai passar com resposta. Ensear o servidor e vamos testar, usar o get, vai voltar tudo de novo, porque a gente reiniciou o servidor, aquela variável tava na memória, então número dois, a not que tem o id aqui, put, e agora voltou de volta o novo livro mesmo, id dois, vamos dar o get barra livres todos, not que realmente mudou, então de novo os detalhes aqui, se eu não passar o id aqui ele vai virar a zero, porque o valor zero da variável inteira é zero, então você tinha que fazer uma validação lá, em uma espécie de merger os objetos, você precisava passar o id aqui no put na sua requisição, então deixe isso com mais exercício, vamos testar as outras coisas, erros, por exemplo, vamos ver a bad request do id, passa um id que não é valido, é um inteiro, bad request, o outro é que deu, sei lá, problema a ler isso, acho que não dá pra reproduzir isso aqui, facilmente eu não sei que eu corrompo ou faço alguma coisa, aqui eu deixo isso, se você quiser tiver uma ideia pra poder regravar esse erro, vamos pro outro erro, esse pode ser que eu fiz o json errado, escrevi errado, vamos ver aqui no put, no corpo eu esqueci das aspas do id, aí eu passo isso, put, dá 400 bad request, vamos colocar os aspas de novo, ah, desculpa, eu esqueci de mudar o id primeiro, primeiro vamos mudar o id pra dois, esse funciona, funcionou ok, agora vou tirar as aspas, acho 200 ok, deu bad request, vou pôr os aspas de novo, andar ok, vamos ver se o livro que não encontrou, o id 222, não existe, 404, não encontrou, pronto, tá, então essa é a função pra modificar o livro, a meta do put, primeiro nós extraímos o id da rota, verificamos se o id é realmente o inteiro, não tem problema, lembrem o corpo, a requisição, se não tiver problema, continuamos, criamos um novo livro, usando o corpo que foi passado na requisição, vamos lá, se não tiver problema da sintaxis de json, dá o loop, lá pro livros, e se a gente encontrar o livro, a gente associa o índice, se não encontrou o livro, manda o status not found, mas se encontrou simplesmente o elemento que está no índice do livro, se torna o livro modificado, e finalmente nós retornamos aqui, como resposta pro cliente, o livro modificado, not no, porque a gente não tem validação, nessa rota aqui, então essa parte aqui talvez você teria que adicionar mais detalhes, por exemplo, se a requisição não incluisse o id do record, você poderia merger o livro modificado com o livro que já existe na lista, por exemplo. Ah bom, então por essa aula é só e até a próxima, tchau.
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: