Aula 49
Revisao Geral da API JSON em Golang com MySQL
Nesta aula fazemos uma revisão geral das coisas que fizemos até agora no curso.
Summary
# Resumo da Aula sobre MySQL com Golang
## Introdução
Nesta aula, revisamos a configuração e implementação de um banco de dados MySQL utilizando Golang.
## Configuração do MySQL
1. **Importação de Pacotes**
- Importar o pacote `database/sql`.
- Utilizar um driver específico para MySQL: `github.com/go-sql-driver/mysql`.
- Note que o uso do underline é necessário para implementar a interface do SQL.
2. **Conexão com o Banco de Dados**
- Utilizar `sql.Open` para abrir a conexão, passando as credenciais (usuário, host, porta, e nome do banco).
- Verificar a conexão com `ping`.
## Configuração do Servidor
- Usamos **Gorilla Mux** para a gestão de rotas.
- Criamos um novo roteador e configuramos `StrictSlash(true)` para evitar problemas com barras finais nas rotas.
- Implementamos middleware para definir o tipo de conteúdo da resposta como `application/json`.
## Rotas
- **Listar Livros (`GET /livros`)**:
- Realiza uma consulta SQL e percorre os registros para criar uma resposta em formato JSON.
- **Buscar Livro (`GET /livros/{id}`)**:
- Obtém o `ID` do livro da rota, converte de `string` para `int`, e utiliza `QueryRow` para buscar um único registro.
- **Modificar Livro (`PUT /livros/{id}`)**:
- Obtém o `ID`, lê o corpo da requisição, decodifica o JSON, e valida os dados antes de realizar a atualização no banco.
- **Excluir Livro (`DELETE /livros/{id}`)**:
- Verifica a existência do livro pelo `ID` e executa o comando de deleção.
- **Cadastrar Livro (`POST /livros`)**:
- Lê o corpo da requisição, valida os dados e insere um novo livro no banco, obtendo o `ID` gerado.
## Validação de Dados
- Implementamos uma função de validação para assegurar que o autor e o título do livro atendem certos critérios (por exemplo, comprimento máximo).
## Conclusão
Implementamos uma API simples com operações CRUD (Criar, Ler, Atualizar, Deletar) para gerenciar livros em um banco de dados MySQL.
**Agradecimentos**
Obrigado por assistir, e até a próxima aula!
Video Transcript
Olá pessoal, esta aula nós vamos revisar tudo que a gente fez até aqui.
Então vamos começar.
Então nós aprendemos a configurar um banco de dados de MySQL no Golang.
Primeiro de tudo a gente tem que portar o pacote data base barra SQL.
Precisamos também de um driver.
No meu caso eu estou usando MySQL, então preciso do driver que tem aqui do gethub.com.go
Traço SQL e traço driver para barra MySQL.
Note que tem que ter esse underscore aqui com espaço antes porque esse pacote aqui
ele vai implementar a interface definida para usar a base SQL, então precisa desse underscore.
Então nós fizemos aqui a configuração do banco de dados da seguinte maneira,
você chama a função method open do SQL.
No meu caso o driver de MySQL e passa aqui as credenciais, o usuário, eu respondo sem a et,
a roupa tcp, parênteses nesse caso o ip ou localhost que eu usei.
Então eu respondo essa porta do MySQL 3306 barra o nome da data base, banco de dados.
Se estiver tudo certo usamos o ping para realmente ver se a conexão credenciais funcionar
porque só fazendo o open não checa a credencial ainda, então usamos o ping.
Então depois disso nós configuramos lá o servidor, usamos o gorilamax, se lembra desse pacote
para poder a gente lidar com parâmetros de rota de maneira mais eficiente, mais fácil, conveniente.
Quero dizer.
Então com isso nós criamos o novo roteador, Mox New Router e usamos esse ponto strict slash true
para poder não ter problema lá da barra que fica no final da sua rota, pode ter a barra ou não,
então para lidar com aquele problema strict slash true.
Usamos um middleware aqui para poder setar o content type,
para as nossas respostas para a application de essence, senão o cliente não interpretaria como format de alta sã.
Esse middleware é bem simples, a gente fez aqui o roteador use middleware,
middleware tem essa assinatura aqui que você tem que retornar um handler
e a gente dá o retorno desse handler, function com r e passa uma função aqui anônimo,
função anônimo aqui, tudo que eu faço só setar o header e eu passo next serve http com wr
para poder ir para o próximo middleware se tiver, ou ele vai bater lá na rota, na função que lida com a rota.
Então vamos lá configurar a rota, temos várias rotas aqui, rota principal que a gente já tinha, não tem nada de mais lá,
então tem a rota para listar os livros, a barra livros, tem esse detalhe aqui do Gorilla Mox,
você pode adicionar na cadeia da função, chamado de função, você fala ponto methods e o verbo de http para essa rota,
então só vai chamar o listar livre se for verbo get, temos o buscar livre, encontrar um livre,
temos um parameters de rota, o id do livre, tem que ser o method do get, se fosse o method put seria de modificar o livre,
se fosse method delete, traz que o livre, para poder cadastrar um livre em vez de ser o get aqui do barra livre vai ser o post,
beba o post, estamos seguindo o padrão rest, então vamos lá, vamos lá no listar livre,
então o listar livre aqui, nós fazemos a chamada do query, para poder fazer um consulta de SQL,
pode ter vários registros na resposta, o segundo argumento de retorno, segundo a coisa de retorno,
valor de retorno é o erro, se o erro não for nele isto é, tenha um erro, nós damos aqui uma resposta,
nesse caso foi 500, cod 500, internal server error, e tal e tal, então ele está aqui,
a gente faz uma fatia de livre, aí vai percorrer nos registros com o ponto next,
põe dentro de um loop, nesse aqui é um while loop, porque no go todos os loops são for,
então é na verdade um while loop, enquanto esse for verdadeiro, nós vamos pegar,
escanear, usa o método scan, para escanear a próxima linha, próximo registro,
a passo o endereço, 1% de cada propriedade da estrutura,
se não o erro, ele leu o live, e nós pegamos e adicionamos a lista, que a gente vai passar lá para o resposta,
damos o close aqui para poder fechar essa consulta, esse erro tem um log aqui, mas não precisa retornar,
no final criamos um novo codificador, e desse codificador codifica a fatia de livros,
que como resposta é a lista de livros de todos os livros do banco de dados, mas é claro que no futuro você teria que ter paginação,
isso aí é um exercício para você fazer desafio, então esse é o lista ao livro,
e também a rota para buscar o livro individual, vamos aqui no buscar livros,
primeiro tem a parâmetro de rota com o id do livro, precisamos acessar a parâmetro de rota,
você fala mooks.var, passa o ponteiro para http request, o r,
diz para retornar o mapa de string para string, a chave é string, o valor é string,
nesse caso a chave é valor id, então posso usar coxete assim para poder obter o valor,
que é o id do livro mais informado, é o que é tipo string, então temos que converter para inteiro,
usamos o str.com.aptoy, converter o string para o inteiro,
eu deixei como exercício para lidar com erro, mas tem a função de modificar que mostra como lidar com erro,
a gente vai ver já, aí a gente dá o query row,
diferente do query row, é o query row só vai dar um registro como resposta,
o query ele dá múltiplo, pode ter múltiples registros da consulta,
query row é só que você quer um, tem um where, where id é isso, você só espera um record,
vamos dar o query row, note que não tem o erro ainda aqui, o erro vai diferindo lá para o scan,
no scan vai ter o erro, scan passa com parâmetros,
os argumentos correspondentes às colunas que você assinou, nesse caso tem três, o id, auto e o título,
não se esqueça do ampersand aqui, e a ordem é importante,
depois de isso, checa o erro e tal, e tal, se não tiver o livro, não achou o livro no banco de dados,
só dá o 404, não encontrado, se encontrou ele vai e codifica o livro e manda como resposta, legal,
pronto, vamos lá ver como é que ir modificar o livro, aprendemos a modificar um livro parecido com buscar o livro,
que você vê a parâmetro da rota, nesse caso vamos lá, vamos pegar o parâmetro de rota, livro id,
converter de string para inteiro, temos o id do livro que a gente quer modificar,
como o cliente manda uma corpo na requisição, a gente tem que ler esse corpo, a gente usa o weoutil,
esse pacote, função read all com r.body, corpo da requisição,
se não tiver eu, a gente vai partir para a etapa de decodificação daquela string,
no formato JSON, para a estrutura de goal, então a gente fala JSON, volta lá embaixo,
decodificar aquele cara para armazenar os dados numa estrutura de tipo livro,
não se esqueça do ampersand aqui, com isso a gente já tem os dados do livro na estrutura,
nesse caso seria legal você adicionar a validação, eu deixei como as assisto o desafio,
a gente já fez por cada já bem parecido, você vai chamar o valida livros aqui,
da mesma maneira, logo após do amarcho, chamo valida livros, ver se não tem problema de validação,
se não tiver a gente continua aqui, vamos fazer o que? Bem, vamos ver se esse livro realmente existe
numa cridada antes de modificar, da query row para achar esse livro, select id auto-title from livros,
where id é sinal de interrogação, por que interrogação? Porque a gente não quer ter problema de segurança,
o chamado injeção, a chamada injeção de SQL, o cliente poderia ser um cara mal e ele poderia escrever,
por exemplo, ponto e vírgula delete from livros, aí se fosse injetado aqui,
por exemplo, se ele botasse um, ponto e vírgula delete from livros, ele iria delatar tudo,
está bem livros, não é bom, e é a calar com seus dados, então para evitar a injeção de SQL,
eu uso interrogação aqui e ponho como segundo o parâmetro para o query row o valor correspondente
aos sinais de interrogação em ordem, correspondente, respectivamente.
Então com isso, damos um scan de novo, que se tiver erro, isso é, esse livro não existe,
você pode modificar algo que não existe, dá 404, se existe a gente procede para dar o update,
olha o exact aqui, eu usei exact porque eu não quero, eu não espero receber nenhum registro,
uma linha está de volta, então update livros, tabela livros set, esses três,
desculpe essas duas, dois campos autores de título, where e de interrogação,
note que os argumentos aqui correspondentes respectivamente.
E tal e tal e tal e no final se der tudo certo no update, não tiver aí,
manda lá e codificado o livro modificado para o cliente, então você vai modificar ali.
Então vamos ver aqui o outro que a gente fez, SQL livre, SQL livre, bem parecido também,
pega o id do livro da rota, verifica aqui, olha aqui, se não teve erro de conversão lá para o id,
pode ser que o usuário digitou ABC que não é inteiro para o parâmetro livre ID,
por isso que tem que ter essa, lidar com o erro, nesse caso retorna bad request que é o código 400,
se der tudo certo aqui, tal, converter para inteiro, primeiro tem que verificar se o livre existe antes de excluir,
será que ele existe, pode só acessar no id, porque não precisa dos outros canto, dos colunos,
porque a gente só precisa saber se achou ou não, se tem esse id lá ou não,
então só o id, pega o id, escaneia, o id do livre, se não tiver problema, é que tem,
se tiver da 404, não existe, então continua aqui, tal, dá o delete com o exec,
delete from livros, wear, não se esqueça do wear, se não estiver wear,
você pode perder todos os dados da tabela, porque vai deletar tudo, cuidado, wear e de sinal de interrogação,
e tal, no final manda os status 201 no content sem conteúdo, porque quando a gente deleta,
não precisa mandar nada com a resposta, esse é o SQL livre, agora vamos sinalizar com o cadastral livre,
lembra aqui, cadastral livre, então leia o corpo que o cliente mandou, decodifica do format JSON
para uma estrutura de goal livre, faz a validação, a gente fez uma função valida livre,
que tem as regras lá, valida livre retorna um string,
se a string for vazia, significa que não há um erro, se a string tiver mais de zero caractério,
do wear, não for vazia, tem um erro, esse erro de validação que a gente vê aqui,
se estiver aí manda o 422, que é um código para dizer, aí você está tudo certo na sua requeridação,
mas os valores são inválidos, sua sintaxe está certa, então mais os valores a gente não pode aceitar,
então inválidos, então manda a resposta com o error de gente fez essa estrutura para poder representar esse erro de resposta,
da resposta, então vê aqui só a validação, valida livre bem simples, se a torna uma string,
checa as regras aqui que a gente fez, se por exemplo, você tem um livre, tem um autor do livre, não pode ser em branco,
então se o comprimento da string autor for zero, isso não tem nenhum caractério, a gente tem que dar erro,
então retorna isso, ou se o total número de caracteres que foi fornecido do autor é maior que 50, a gente retorna um erro,
porque esse número é arbitrário, que a gente só escolheu porque no nosso banco de dados a coluna de autor tem ver, car, 50,
no máximo 50 caracteres, então é arbitrário, você escolhe que você quer que esteja o máximo, isso é só para demonstrar que a gente pode fazer essas validações de caracteres.
Se você fizer o computit, se eu botei no máximo 100 caracteres, por isso que tem essa regra aqui, eu dividi aqui só para você entender que a gente pode fazer várias regras,
pode dividir em vez de combinar, pode combinar ou dividir qualquer coisa, e no final aqui se não ver nenhum erro,
então se todos esses ifs forem falsos, condições, isso significa que não houve erro de validação, retorno de string vazia, o livro está válido.
Eu também mencionei anteriormente que nesse caso retorno um erro, se você quiser retornar múltiplos erros, é só converter de string para uma fatia de string,
aí em vez de dar o return aqui, você faz uma lista de livros, fatia de livros e dá o append, e no final, em vez de retornar a string vazia,
você retorna aquela fatia de livros, a lista que você compilou depois de rodar por todas essas regras.
Aí de volta ao lado do cadastro, você checa em vez de, isso vai ser a mesma coisa, na verdade, porque o langauge também vai ser de uma lista,
de comprimento da fatia, for maior que zero, teve erro, se for zero, não teve erro.
Então o resposta com erro é uma estrutura bem simples, que tem um campo chamado erro, que é do tipo string,
lá no formato de direção aparece como a chave erro.
Tá?
Então é isso depois da validação, se tudo dá certo, a gente dá um insert para poder cadastrar esse livre,
insert em um nome da tabela, os colonas e os valores com interrogação, não esqueça para evitar a injeção de SQL,
valores aqui correspondentes, respectivamente.
Nesse caso aqui a gente teve que obter o ID que foi gerado pelo banco de dados, do alto incremento.
Nesse caso a gente usou o last insert ID, essa função a gente chamou, que vem do resultado aqui,
aí a gente pega o ID gerado, se não tiver nenhum erro.
E a gente seta para essa estrutura no livro, que esse novo livro vai ser enviado como resposta ao cliente,
com os dados, porque o cliente vai saber do ID que foi gerado, né?
Vai ter o novo livro enviado como cliente, esse novo livro vai conter o ID que foi gerado do banco de dados.
Tá?
Então, essa é só a API que serve formato Json, a gente fez os crud,
create read update delete, criar leitura, falso dação e deletar dados, mais que é o destrutor de livros.
Muito obrigado por assistir e te vejo na próxima, tá?
Até mais!
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: