Aula 07
Rota POST para Cadastrar um Livro em Golang - API JSON
Nesta aula iniciamos a implementação da rota para cadastrar um livro.
O corpo de uma requisição pode ser obtido através do parâmetro r
, que é do tipo *http.Request
.
Usamos o pacote ioutil
para ler o corpo da requisição e armazena-lo em uma variável. Depois disso, temos que decodificar do formato JSON para a estrutura Livro.
Adicionamos o novo livro à lista de livros que fica na memória, na variável Livros, usando o append
.
Finalmente, convertemos o novo livro, que agora tem um id
, de volta para JSON usando o pacote json
. No final mandamos a resposta para o cliente, que será interpretada em formato json devido ao header Content-Type que tem valor application/json
.
Summary
# Resumo do Transcript
Neste áudio, o autor discute a criação de uma rota no servidor para gerenciar livros utilizando a linguagem Go. A seguir, estão os principais pontos abordados:
1. **Criação de Função Intermediária**:
- Em vez de redirecionar diretamente para a listagem de livros quando a rota `/livros` é acessada, é criada uma função intermediária chamada `rotearLivros`.
- Essa função verifica o método da requisição HTTP (GET ou POST) e chama a função apropriada: `listarLivros` para GET e `cadastrarLivro` para POST.
2. **Implementação de Listagem de Livros**:
- A função `listarLivros` é chamada quando a rota `/livros` é acessada com o método GET, retornando uma lista de livros.
- A função `cadastrarLivro` será implementada para lidar com a criação de novos livros quando chamada via método POST.
3. **Resposta em JSON**:
- A resposta dos métodos é definida com o cabeçalho `Content-Type` como `application/json`.
4. **Leitura do Corpo da Requisição**:
- Para a função `cadastrarLivro`, o áudio explica como ler os dados do corpo da requisição usando `io/ioutil.ReadAll`.
- Os dados lidos são armazenados em uma variável para serem processados posteriormente.
5. **Decodificação de JSON**:
- Utiliza-se a função `json.Unmarshal` para decodificar os dados JSON em uma estrutura chamada `novoLivro`.
- Os novos livros são adicionados à lista existente de livros.
6. **Atualização do ID do Livro**:
- O novo livro recebe um ID gerado a partir do comprimento atual da lista de livros, garantindo que os IDs sejam únicos.
7. **Testes com Postman**:
- O autor demonstra como testar as rotas usando o Postman, onde ele mostra a criação de novos livros e a listagem dos livros existentes.
8. **Validações e Melhorias Futuras**:
- São mencionadas melhorias possíveis, como a validação dos dados de entrada para garantir que todos os campos obrigatórios sejam preenchidos.
Em resumo, o autor detalha um processo de criação de uma pequena API para gerenciar livros em Go, enfatizando aspectos como roteamento, manipulação de JSON e a estruturação de respostas.
Video Transcript
Vamos fazer o seguinte, então aqui em vez, quando bater no barro livros, em vez de ir
para o listar livros, vamos criar uma função intermediária que vai rotear para listar livros
ou para cada estrada dependendo do vevo, seja ele get ou seja host.
Então, pode chamar a função de qualquer coisa, vou chamar rotear livros, por exemplo.
E vou fazer outra função aqui fora, rotear livros.
Vai levar a mesma assinatura do listar livros, w, http, responsewriter
e o r que vai ser do tipo ponteiro para request, http.request.
Primeiro, vamos só testar se não vai quebrar nada, vou chamar o listar livros com w e r,
dentro dessa função rotear livros.
Quando bater em livros, vai rotear livros.
Do rotear livros, vai chamar o listar livros com w e r e vai bater aqui.
Vou matar o servidor aqui no terminal, compilar e rodar novamente.
O navegador, deixa eu ver barra livros, poderia até usar o postmena.
Isso andou direitinho sem erro, quando eu fui para o barra livros.
Vamos lá no postmena agora, ah, agora não, desculpa.
Vamos voltar ao editor de texto.
Então, só vamos usar o listar livros se o método for get.
Então, a gente vai optar w, r, método for get.
Aí, aqui a gente vai chamar o listar livros.
Se não, né?
Vamos utilizar o else if.
O r.meta, post.
Nós vamos chamar o cadastrar livre se a gente vai criar.
Com o w e com r.
Então, vamos aqui em cima.
Fã que cadastrar livre.
No singular, não é plural, desculpa.
Aquela mesma assinatura, w, hptp.responsewriter,
primeiro parâmetro, segundo r, estrela, hptp.request.
Ah.
Então, vamos só testar aqui.
Ah.
Então, vamos só testar aqui.
Mandar uma resposta aqui, por exemplo.
Vamos dar encoder, encode.
Livros subzero.
Encoder vai ser json, new encoder, w.
Eu vou fazer a mesma coisa aqui de cima.
Ah, copiar isso também.
Mas eu vou pegar só o primeiro livro pra ver se funciona.
Tá?
Isso aqui não é a implementação de cadastrar livre ainda.
E eu provavelmente devia haver um erro ali no else if.
Ahahah.
Ah.
Tá ali.
O que pôs na outra linha?
Tá?
Vamos aqui no postman agora.
Dá post livros.
Bateu só o primeiro livro, como a gente escreveu lá.
Então, tá funcionando direito.
Se eu vou mudar o verbo para get,
ele vai bater lá no listar livros, que lista os três livros.
De novo.
Pro post, só aquele único livro.
Certo?
Então, vou pagar aqui.
Na verdade, a gente vai fazer uma coisa aqui com a mesma code,
mas vamos escrever aqui.
Então, primeiro de tudo aqui, vamos setar o nosso red do cadastrar livre.
Porque a nossa resposta vai ser do tipo application json,
em vez de texto plano.
Então, nós setamos o header da nossa resposta da HTTP.
Diz ditamos w.header com parênteses.
E pegamos, damos o set, né?
Pro header chamado content, pra s type.
O valor do header é application bar json.
Certo, legal.
Agora, vamos fazer o seguinte.
Vamos ler a resposta do servidor.
De volta aqui ao postman, pra poder criar um livro novo,
eu vou aqui no parâmetros, autorizê-lo,
headers no body, que é o corpo da requisição.
Vou clicar em role, e eu vou mudar de text, texto para json.
Nisso, eu posso criar um exemplo de um livro novo que nós queremos cadastrar.
Então, o livro tem o quê?
Se a gente se lembra lá, tem um título e um autor.
Muito bem.
Deixa eu voltar ao postman.
Então, eu vou dar o title, novo livro, autor, alguém, ao ver se...
Tá?
Vamos ver no que dá aqui.
Então, esse é o corpo do pedido da requisição do tipo sjson.
Esse que esses dados irão aparecer através da variável r.
Agora, r.body, tá?
r.body é que vai estar esses dados.
Mas, para poder lermos esses dados, precisamos de uma ajuda de uma função.
Uma delas é, através do pacote io, util, a função readall.
Então, a função chamada readall vai com um argumento body.
Mas, readall está dentro do pacote io, util.
Tá?
Agora, o readall, ele leva com um argumento um leitor reader, tá?
E ele responde com duas coisas.
Primeiro, uma fatia de byte.
Segundo, erro se tiver.
Tá bom?
Quando você quiser referenciar isso, é só ir lá na documentação.
Por exemplo, voltando no navegador, eu vou aqui no site do golang.org packages
para clicar io, util lá na lista de packages.
Tá bom?
Olha aqui.
H, I, io, util.
Então, funk as readall.
Olha aqui.
Argumento a io.reader, do tipo, retorna uma,
não, a fatia de byte.
Slices de byte e o erro.
Tá?
Se tiver erro, se não tiver erro, vai ser new.
Então, ele vai ler as coisas do reader, as coisas do reader, as coisas do reader.
As coisas do reader até o final do arquivo, end of file, né?
É a OF.
Vamos voltar ao nav-side todo texto.
Então, vamos aqui
chamar de corpo, sei lá, body,
se você quiser.
Mas tem outro argumento que é o erro, tá?
Erro.
Aí, se der erro, você vai fazer alguma coisa, tá?
Se erro não for new, né?
Você pode fazer, lidar com o erro.
Eu vou deixar aí com as vezes para você.
Mas se não, continue o código.
Mas se não, continue o código.
Tá?
Agora, nós temos esse body que vai ter,
que a gente escreveu aqui, mais precisamos
tirar do formato JSON, que vai ser o quê?
Um array, né?
Um array, não, uma fatia de byte.
Então, temos que converter para o formato JSON
e para tornar na estrutura, né?
Uma struct que tem o livro, né?
Então, vamos fazer o seguinte.
Nós vamos usar o pacotjson.anmarchal
para decodificar.
Pegue o body com o primeiro argumento.
Mas agora, o segundo argumento vai ser aquilo
que você quer aplicar, né?
Converter para armazenar o JSON.
Então, vou armazenar um variável que eu vou criar aqui,
vou chamar de novo livro.
Um novo livro vai ser o quê?
Vou chamar var novo livro, vai ter tipo livro.
Criar um novo livro.
Ele vai decodificar o corpo, que é o JSON,
e vai passar para a estrutura novo livro aqui.
Depois disso, nós vamos atualizar a nossa lista de livros,
que é um variável aqui global nesse copo do pacotjson.
Chamar livros, vamos adicionar o final da lista,
um novo livro.
Para poder fazer isso, vou dar o...
Só chamar append,
livros, um novo livro,
para poder adicionar o final,
e vou redefinir a variável livros
com aquela nova lista, com um novo livro no final.
Finalmente, vamos enviar como resposta
para o cliente, como é o padrão REST,
sempre manda de volta aquele recorde que foi criado.
Normalmente, ele adiciona o ID que vem do banco de dados.
Nesse caso, a gente não teve nenhum ID,
mas nós podemos adicionar depois.
Então, aqui, vez em code livros subzero,
ponho novo livro.
Tá?
Então, vamos testar isso.
De volta ao terminal,
mato o servidor, roda aqui de novo,
ah, eu esqueci de o quê?
Tá dizendo que IO2 está undefined,
indefinido, porque eu esqueci de importar.
Então, o IO2, temos que importar.
Vai lá em cima, é no import,
IO barro IO2.
Parece que o IO tem lá no documentação,
que tem que IO barro IO2.
Tá?
E o import.
Vamos lá de novo.
Postman, eu vou dar o post.
Send.
A resposta está aqui embaixo,
que não dá para ver.
Deixa eu aumentar.
Tá bom?
Então, título...
Ah, botei título em inglês.
Desculpa.
É título que eu tinha escrevido errado.
Você está novamente.
Certo.
Então, mandou de volta aqui novo livro,
IO2, note o ID é zero,
porque se você não setar um valor de variável no Go,
ele sempre seta para o valor zero.
Nesse caso, o valor de zero de 1.
Um inteiro é zero.
A gente pode ajeitar o ID já.
Como a gente não tem banco de dados,
a gente pode fazer de conta que tem um.
Mas eu quero ver aqui o barra livros no Get.
Eu vou abrir a nova aba aqui do postman
e dar o Get para o livro para ver se é adicionado no final.
Então, o Arani e Kazul, Dham Kazul,
tinham aquele título errado.
E o que a gente adicionou agora.
Note que eu não tinha errado o nome da propriedade.
Ele nem pegou,
mas ele setou o título para a vazia, porque é o valor zero.
Se você não der um valor para um string em Go,
ele usa o valor zero, que é string vazia.
Na última raça da API, não tem nenhuma validação.
Para ver se você passou ou não as propriedades requeridas.
E assim por diante.
Isso é uma dessas coisas que pode fazer depois e depois.
A gente pode fazer o básico.
De volta que eu aditou de texto,
vamos só corrigir aquele adiciono no ID.
Para poder fazer isso bem simples, nesse caso,
como os records estão dentro dessa lista de livros,
nós podemos utilizar o comprimento dessa lista que tem aqui.
Por exemplo, agora é um, dois, três.
Então, o próximo ID vai ter que ser nesse caso,
como começa contando de um.
Vai ser um, dois, três.
Vai ser o quatro.
Uma maneira é adicionar para livro primeiro.
Com um adicionando no final.
Ou adiciona antes.
Vamos ver aqui.
No cadastralivo, de volta a função cadastralivo.
Quando você fizer um novo livro, dá um Marshall.
Aí você, depois de fazer isso,
você pode setar um novo livro, ponto, nesse caso, o ID.
Mas qual vai ser o 9ID?
Bem, o livro agora tem que adicionar um no final.
Você pega o link do livro que tem agora e adiciona um.
Porque ele começa contando de ID um lá em cima.
Essa é a maneira que eu fiz aqui.
Não é muito boa.
Deve ter uma variável, por exemplo, último ID.
Como ele não tem um boco de dados para...
dessas coisas, eu vou fazer dessa maneira simples
só para você ter alguma coisa.
Vamos testar aqui.
Volta o terminal.
Vou dar o post lá.
A nota que agora veio com o ID, bateu o ID quatro.
Porque o último era...
O primeiro era um, dois, três, o link.
Vamos ver.
Então tem um, dois, três.
Anteriormente, três mais um é quatro.
Então, ID bateu quatro.
Tá bom?
Então vamos revisar o que a gente fez.
Nós criamos aqui a nova rota para cadastrar o livro,
no barro Livros.
Ele bate aqui nessa função.
Ele arranha no Dota Livros.
Ele olha o método.
Nesse caso, o método tem que ser post.
Então, vamos bater no post.
Ele vai chamar o cadastrar o livro.
Note que você poderia também usar o switch aqui,
em vez de FLS, depende de você.
Ele bate lá no cadastrar o livro.
Cadastrar o livro set to header para JSON, para resposta.
Aí nós lembremos, né, o corpo da requisição.
Que vem do request.
Com a nossa função aqui, weoutill.readall.
Ele retome duas coisas.
Primeiro, é o corpo que foi decodificado para fatia de byte.
E o erro?
E se o erro não for new nesse caso?
Aconteceu uma coisa.
Você pode mandar uma resposta e der o erro, alguma coisa assim.
Eu deixo como exercício depois para você fazer.
Aí criamos a nova variável do tipo livro.
Decordificamos a string do corpo de byte,
no enjsump, para variável novo livro.
Atribuímos o ID do novo livro.
Finalmente, adicionamos esse novo livro no final da lista,
que está rodando aqui na memória.
E finalmente, nós pegamos esse novo livro
e retornamos como resposta para o cliente por padrão resto.
Sempre retorna aquele que foi criado.
Tchau!
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: