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.