{"id":2226,"date":"2026-07-25T19:45:17","date_gmt":"2026-07-25T22:45:17","guid":{"rendered":"https:\/\/desvendandoocodigo.com.br\/?p=2226"},"modified":"2026-07-25T19:47:09","modified_gmt":"2026-07-25T22:47:09","slug":"node-js-e-express-na-pratica-aprenda-put-e-delete-criando-uma-api-rest-completa","status":"publish","type":"post","link":"https:\/\/desvendandoocodigo.com.br\/?p=2226","title":{"rendered":"Node.js e Express na Pr\u00e1tica | Aprenda PUT e DELETE Criando uma API REST Completa"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Depois de aprender como criar rotas <strong>GET<\/strong> e <strong>POST<\/strong>, chegou o momento de concluir a primeira etapa da constru\u00e7\u00e3o de uma <strong>API REST<\/strong> utilizando <strong>Node.js<\/strong> e <strong>Express<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nesta aula vamos aprender duas opera\u00e7\u00f5es fundamentais presentes em praticamente qualquer sistema profissional: <strong>atualizar informa\u00e7\u00f5es (PUT)<\/strong> e <strong>remover registros (DELETE)<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embora neste projeto utilizemos apenas um <strong>array em mem\u00f3ria<\/strong>, toda a l\u00f3gica apresentada \u00e9 exatamente a mesma utilizada quando trabalhamos com bancos de dados como <strong>MySQL<\/strong>, <strong>PostgreSQL<\/strong>, <strong>SQL Server<\/strong> ou <strong>MongoDB<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O objetivo desta aula n\u00e3o \u00e9 apenas decorar comandos, mas compreender como uma API recebe uma requisi\u00e7\u00e3o, identifica um registro espec\u00edfico, altera seus dados, remove informa\u00e7\u00f5es e retorna uma resposta adequada para o cliente.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Assista ao v\u00eddeo desta aula<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcfa <strong>Live completa<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Node.js e Express na Pr\u00e1tica | Aprenda PUT e DELETE Criando uma API REST Completa\" width=\"960\" height=\"720\" src=\"https:\/\/www.youtube.com\/embed\/cIa3Inkc-ic?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\udcfa <strong>V\u00eddeo anterior (GET e POST)<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"M\u00e9todo POST no Express.js | Como Enviar JSON para uma API com Node.js\" width=\"960\" height=\"540\" src=\"https:\/\/www.youtube.com\/embed\/Ck6jeo-aKPU?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">O que \u00e9 o m\u00e9todo PUT?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Imagine um sistema de cadastro de alunos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voc\u00ea possui um aluno j\u00e1 cadastrado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    id: 3,\n    nome: \"Ana Clara\",\n    curso: \"ADM Noite\"\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Agora imagine que ela mudou de turma.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ao inv\u00e9s de criar um novo cadastro, precisamos apenas atualizar as informa\u00e7\u00f5es existentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 exatamente essa a fun\u00e7\u00e3o do m\u00e9todo <strong>PUT<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ele permite alterar um recurso j\u00e1 existente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na pr\u00e1tica, a requisi\u00e7\u00e3o fica parecida com esta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PUT \/alunos\/3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Observe que o <strong>ID<\/strong> faz parte da pr\u00f3pria URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Isso acontece porque precisamos informar exatamente <strong>qual registro ser\u00e1 alterado<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">O que \u00e9 o m\u00e9todo DELETE?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">O m\u00e9todo <strong>DELETE<\/strong> possui um funcionamento muito semelhante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A diferen\u00e7a \u00e9 que agora queremos remover um registro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE \/alunos\/3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Novamente o ID informa qual aluno ser\u00e1 removido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem essa informa\u00e7\u00e3o, a API n\u00e3o saberia qual registro excluir.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Por que utilizamos par\u00e2metros na URL?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Nesta aula utilizamos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/alunos\/:id<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esse trecho indica que existe um par\u00e2metro chamado <strong>id<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando o usu\u00e1rio faz uma requisi\u00e7\u00e3o como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/alunos\/3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O Express captura automaticamente esse valor atrav\u00e9s de:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>req.params.id<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Como par\u00e2metros da URL chegam como texto (string), tamb\u00e9m aprendemos a converter esse valor para n\u00famero:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const id = Number(req.params.id);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Essa convers\u00e3o evita diversos problemas durante as compara\u00e7\u00f5es.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Criando uma API REST passo a passo<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para simplificar o aprendizado, constru\u00edmos um pequeno banco de dados em mem\u00f3ria utilizando um vetor de objetos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let alunos = &#91;\n    {\n        id: 1,\n        nome: \"Marcos\",\n        curso: \"Desenvolvimento de Sistemas\"\n    },\n    {\n        id: 2,\n        nome: \"Maria\",\n        curso: \"Inform\u00e1tica\"\n    }\n];<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Embora os dados desapare\u00e7am quando o servidor \u00e9 reiniciado, essa abordagem permite focar exclusivamente na l\u00f3gica da API antes de introduzir um banco de dados real.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Middleware express.json()<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de trabalhar com requisi\u00e7\u00f5es POST e PUT foi necess\u00e1rio configurar um middleware muito importante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use(express.json());<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esse middleware permite que o Express interprete automaticamente os dados enviados em formato JSON.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sem ele:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>req.body ficar\u00e1 vazio;<\/li>\n\n\n\n<li>os dados enviados pelo cliente n\u00e3o poder\u00e3o ser lidos;<\/li>\n\n\n\n<li>a API n\u00e3o conseguir\u00e1 atualizar ou cadastrar informa\u00e7\u00f5es.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Essa \u00e9 uma das configura\u00e7\u00f5es obrigat\u00f3rias em praticamente qualquer projeto Express.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Revisando rapidamente o m\u00e9todo POST<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Antes de criar o PUT, fizemos uma breve revis\u00e3o do m\u00e9todo POST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nele recebemos um objeto atrav\u00e9s de:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>req.body<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Depois adicionamos esse objeto ao vetor utilizando:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>alunos.push(novoAluno);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Essa revis\u00e3o facilita o entendimento do funcionamento do PUT, j\u00e1 que ambos recebem informa\u00e7\u00f5es atrav\u00e9s do corpo da requisi\u00e7\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Localizando um aluno utilizando find()<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Para atualizar um registro, primeiro precisamos encontr\u00e1-lo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Foi exatamente para isso que utilizamos o m\u00e9todo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>find()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const aluno = alunos.find(\n    aluno =&gt; aluno.id === id\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O m\u00e9todo percorre o vetor procurando o primeiro objeto cujo ID seja igual ao informado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Quando encontra, retorna o objeto completo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Caso contr\u00e1rio retorna:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>undefined<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Atualizando os dados do objeto<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Depois que localizamos o objeto, basta alterar suas propriedades.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>aluno.nome = req.body.nome;\n\naluno.curso = req.body.curso;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Observe que n\u00e3o estamos criando um novo objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estamos modificando o objeto existente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 exatamente assim que funciona um UPDATE em um banco de dados.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Retornando respostas HTTP<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sempre que uma opera\u00e7\u00e3o \u00e9 realizada, \u00e9 importante informar ao cliente se tudo ocorreu corretamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nesta aula utilizamos respostas como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>res.status(200).json({\n    mensagem: \"Aluno atualizado com sucesso\"\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Caso o aluno n\u00e3o exista:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>res.status(404).json({\n    mensagem: \"Aluno n\u00e3o encontrado\"\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Esses c\u00f3digos fazem parte do padr\u00e3o HTTP utilizado por APIs em todo o mundo.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Removendo registros com DELETE<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ap\u00f3s concluir o PUT, criamos a rota DELETE.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O primeiro passo foi localizar a posi\u00e7\u00e3o do aluno dentro do vetor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para isso utilizamos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>findIndex()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Exemplo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const index = alunos.findIndex(\n    aluno =&gt; aluno.id === id\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A diferen\u00e7a entre <strong>find()<\/strong> e <strong>findIndex()<\/strong> \u00e9 importante.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>find()<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Retorna o objeto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>findIndex()<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Retorna apenas a posi\u00e7\u00e3o do objeto dentro do vetor.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Excluindo utilizando splice()<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Depois de localizar o \u00edndice, utilizamos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>splice(index, 1);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">O primeiro par\u00e2metro indica a posi\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O segundo informa quantos elementos ser\u00e3o removidos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste caso:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">significa remover apenas um aluno.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Tratando erros antes da exclus\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Durante a aula tamb\u00e9m verificamos se o aluno realmente existia.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>if(index === -1){\n    return res.status(404).json({\n        mensagem:\"Aluno n\u00e3o encontrado\"\n    });\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Essa valida\u00e7\u00e3o impede que a API tente remover registros inexistentes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 uma pr\u00e1tica utilizada em qualquer aplica\u00e7\u00e3o profissional.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Testando tudo no Thunder Client<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Ao longo da aula todas as rotas foram testadas utilizando o <strong>Thunder Client<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Foi poss\u00edvel acompanhar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>cadastro de alunos;<\/li>\n\n\n\n<li>consulta utilizando GET;<\/li>\n\n\n\n<li>atualiza\u00e7\u00e3o utilizando PUT;<\/li>\n\n\n\n<li>exclus\u00e3o utilizando DELETE;<\/li>\n\n\n\n<li>respostas HTTP;<\/li>\n\n\n\n<li>mensagens JSON retornadas pela API.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Esse processo \u00e9 extremamente importante para validar o funcionamento da aplica\u00e7\u00e3o antes da integra\u00e7\u00e3o com o Front-end.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Um erro real durante a aula<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Durante a implementa\u00e7\u00e3o tamb\u00e9m ocorreu um pequeno erro de l\u00f3gica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ao inv\u00e9s de simplesmente corrigir e seguir em frente, aproveitamos a situa\u00e7\u00e3o para mostrar como funciona o processo de depura\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa \u00e9 uma das partes mais importantes para quem est\u00e1 come\u00e7ando.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo desenvolvedor passa muito mais tempo investigando erros do que escrevendo c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aprender a identificar problemas faz parte da profiss\u00e3o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">O que vem nas pr\u00f3ximas aulas?<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Agora que j\u00e1 conhecemos os quatro principais m\u00e9todos HTTP:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GET<\/li>\n\n\n\n<li>POST<\/li>\n\n\n\n<li>PUT<\/li>\n\n\n\n<li>DELETE<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">estamos preparados para avan\u00e7ar para projetos maiores.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nas pr\u00f3ximas aulas da s\u00e9rie veremos assuntos como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>persist\u00eancia de dados em arquivos JSON;<\/li>\n\n\n\n<li>integra\u00e7\u00e3o com bancos de dados;<\/li>\n\n\n\n<li>MySQL;<\/li>\n\n\n\n<li>PostgreSQL;<\/li>\n\n\n\n<li>autentica\u00e7\u00e3o;<\/li>\n\n\n\n<li>APIs profissionais;<\/li>\n\n\n\n<li>arquitetura de projetos Express.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Cada novo conte\u00fado aproveitar\u00e1 exatamente a base constru\u00edda nesta sequ\u00eancia de aulas.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Conclus\u00e3o<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Os m\u00e9todos <strong>PUT<\/strong> e <strong>DELETE<\/strong> fazem parte do dia a dia de qualquer desenvolvedor Back-end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sempre que um sistema precisa atualizar ou remover informa\u00e7\u00f5es, essas opera\u00e7\u00f5es entram em a\u00e7\u00e3o.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ao compreender como localizar registros, utilizar par\u00e2metros na URL, manipular objetos JavaScript e retornar respostas HTTP adequadas, voc\u00ea passa a entender o funcionamento interno de praticamente todas as APIs REST modernas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Embora nesta aula tenhamos utilizado apenas um vetor em mem\u00f3ria, toda a l\u00f3gica apresentada ser\u00e1 reaproveitada quando migrarmos para bancos de dados reais como <strong>MySQL<\/strong> e <strong>PostgreSQL<\/strong>, tornando essa uma das etapas mais importantes para quem deseja aprender desenvolvimento Back-end com JavaScript.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">O que voc\u00ea aprendeu nesta aula<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u2705 Node.js<\/li>\n\n\n\n<li>\u2705 Express<\/li>\n\n\n\n<li>\u2705 API REST<\/li>\n\n\n\n<li>\u2705 M\u00e9todo GET<\/li>\n\n\n\n<li>\u2705 M\u00e9todo POST<\/li>\n\n\n\n<li>\u2705 M\u00e9todo PUT<\/li>\n\n\n\n<li>\u2705 M\u00e9todo DELETE<\/li>\n\n\n\n<li>\u2705 req.params<\/li>\n\n\n\n<li>\u2705 req.body<\/li>\n\n\n\n<li>\u2705 express.json()<\/li>\n\n\n\n<li>\u2705 Middleware<\/li>\n\n\n\n<li>\u2705 Objetos JavaScript<\/li>\n\n\n\n<li>\u2705 Arrays<\/li>\n\n\n\n<li>\u2705 find()<\/li>\n\n\n\n<li>\u2705 findIndex()<\/li>\n\n\n\n<li>\u2705 splice()<\/li>\n\n\n\n<li>\u2705 Status Code 200<\/li>\n\n\n\n<li>\u2705 Status Code 201<\/li>\n\n\n\n<li>\u2705 Status Code 404<\/li>\n\n\n\n<li>\u2705 Thunder Client<\/li>\n\n\n\n<li>\u2705 Atualiza\u00e7\u00e3o de Objetos<\/li>\n\n\n\n<li>\u2705 Exclus\u00e3o de Dados<\/li>\n\n\n\n<li>\u2705 JavaScript Back-end<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Depois de aprender como criar rotas GET e POST, chegou o momento de concluir a primeira etapa da constru\u00e7\u00e3o de uma API REST utilizando Node.js e Express. Nesta aula vamos aprender duas opera\u00e7\u00f5es fundamentais presentes em praticamente qualquer sistema profissional: atualizar informa\u00e7\u00f5es (PUT) e remover registros (DELETE). Embora neste projeto utilizemos apenas um array em mem\u00f3ria, toda a l\u00f3gica apresentada \u00e9 exatamente a mesma utilizada quando trabalhamos com bancos de dados como MySQL, PostgreSQL, SQL Server ou MongoDB. O objetivo desta aula n\u00e3o \u00e9 apenas decorar comandos, mas compreender como uma API recebe uma requisi\u00e7\u00e3o, identifica um registro espec\u00edfico, altera seus dados, remove informa\u00e7\u00f5es e retorna uma resposta adequada para o cliente. Assista ao v\u00eddeo desta aula \ud83d\udcfa Live completa \ud83d\udcfa V\u00eddeo anterior (GET e POST) O que \u00e9 o m\u00e9todo PUT? Imagine um sistema de cadastro de alunos. Voc\u00ea possui um aluno j\u00e1 cadastrado: Agora imagine que ela mudou de turma. Ao inv\u00e9s de criar um novo cadastro, precisamos apenas atualizar as informa\u00e7\u00f5es existentes. \u00c9 exatamente essa a fun\u00e7\u00e3o do m\u00e9todo PUT. Ele permite alterar um recurso j\u00e1 existente. Na pr\u00e1tica, a requisi\u00e7\u00e3o fica parecida com esta: Observe que o ID faz parte da pr\u00f3pria URL. Isso acontece porque precisamos informar exatamente qual registro ser\u00e1 alterado. O que \u00e9 o m\u00e9todo DELETE? O m\u00e9todo DELETE possui um funcionamento muito semelhante. A diferen\u00e7a \u00e9 que agora queremos remover um registro. Exemplo: Novamente o ID informa qual aluno ser\u00e1 removido. Sem essa informa\u00e7\u00e3o, a API n\u00e3o saberia qual registro excluir. Por que utilizamos par\u00e2metros na URL? Nesta aula utilizamos: Esse trecho indica que existe um par\u00e2metro chamado id. Quando o usu\u00e1rio faz uma requisi\u00e7\u00e3o como: O Express captura automaticamente esse valor atrav\u00e9s de: Como par\u00e2metros da URL chegam como texto (string), tamb\u00e9m aprendemos a converter esse valor para n\u00famero: Essa convers\u00e3o evita diversos problemas durante as compara\u00e7\u00f5es. Criando uma API REST passo a passo Para simplificar o aprendizado, constru\u00edmos um pequeno banco de dados em mem\u00f3ria utilizando um vetor de objetos. Embora os dados desapare\u00e7am quando o servidor \u00e9 reiniciado, essa abordagem permite focar exclusivamente na l\u00f3gica da API antes de introduzir um banco de dados real. Middleware express.json() Antes de trabalhar com requisi\u00e7\u00f5es POST e PUT foi necess\u00e1rio configurar um middleware muito importante: Esse middleware permite que o Express interprete automaticamente os dados enviados em formato JSON. Sem ele: Essa \u00e9 uma das configura\u00e7\u00f5es obrigat\u00f3rias em praticamente qualquer projeto Express. Revisando rapidamente o m\u00e9todo POST Antes de criar o PUT, fizemos uma breve revis\u00e3o do m\u00e9todo POST. Nele recebemos um objeto atrav\u00e9s de: Depois adicionamos esse objeto ao vetor utilizando: Essa revis\u00e3o facilita o entendimento do funcionamento do PUT, j\u00e1 que ambos recebem informa\u00e7\u00f5es atrav\u00e9s do corpo da requisi\u00e7\u00e3o. Localizando um aluno utilizando find() Para atualizar um registro, primeiro precisamos encontr\u00e1-lo. Foi exatamente para isso que utilizamos o m\u00e9todo: Exemplo: O m\u00e9todo percorre o vetor procurando o primeiro objeto cujo ID seja igual ao informado. Quando encontra, retorna o objeto completo. Caso contr\u00e1rio retorna: Atualizando os dados do objeto Depois que localizamos o objeto, basta alterar suas propriedades. Observe que n\u00e3o estamos criando um novo objeto. Estamos modificando o objeto existente. \u00c9 exatamente assim que funciona um UPDATE em um banco de dados. Retornando respostas HTTP Sempre que uma opera\u00e7\u00e3o \u00e9 realizada, \u00e9 importante informar ao cliente se tudo ocorreu corretamente. Nesta aula utilizamos respostas como: Caso o aluno n\u00e3o exista: Esses c\u00f3digos fazem parte do padr\u00e3o HTTP utilizado por APIs em todo o mundo. Removendo registros com DELETE Ap\u00f3s concluir o PUT, criamos a rota DELETE. O primeiro passo foi localizar a posi\u00e7\u00e3o do aluno dentro do vetor. Para isso utilizamos: Exemplo: A diferen\u00e7a entre find() e findIndex() \u00e9 importante. find() Retorna o objeto. findIndex() Retorna apenas a posi\u00e7\u00e3o do objeto dentro do vetor. Excluindo utilizando splice() Depois de localizar o \u00edndice, utilizamos: O primeiro par\u00e2metro indica a posi\u00e7\u00e3o. O segundo informa quantos elementos ser\u00e3o removidos. Neste caso: significa remover apenas um aluno. Tratando erros antes da exclus\u00e3o Durante a aula tamb\u00e9m verificamos se o aluno realmente existia. Essa valida\u00e7\u00e3o impede que a API tente remover registros inexistentes. \u00c9 uma pr\u00e1tica utilizada em qualquer aplica\u00e7\u00e3o profissional. Testando tudo no Thunder Client Ao longo da aula todas as rotas foram testadas utilizando o Thunder Client. Foi poss\u00edvel acompanhar: Esse processo \u00e9 extremamente importante para validar o funcionamento da aplica\u00e7\u00e3o antes da integra\u00e7\u00e3o com o Front-end. Um erro real durante a aula Durante a implementa\u00e7\u00e3o tamb\u00e9m ocorreu um pequeno erro de l\u00f3gica. Ao inv\u00e9s de simplesmente corrigir e seguir em frente, aproveitamos a situa\u00e7\u00e3o para mostrar como funciona o processo de depura\u00e7\u00e3o. Essa \u00e9 uma das partes mais importantes para quem est\u00e1 come\u00e7ando. Todo desenvolvedor passa muito mais tempo investigando erros do que escrevendo c\u00f3digo. Aprender a identificar problemas faz parte da profiss\u00e3o. O que vem nas pr\u00f3ximas aulas? Agora que j\u00e1 conhecemos os quatro principais m\u00e9todos HTTP: estamos preparados para avan\u00e7ar para projetos maiores. Nas pr\u00f3ximas aulas da s\u00e9rie veremos assuntos como: Cada novo conte\u00fado aproveitar\u00e1 exatamente a base constru\u00edda nesta sequ\u00eancia de aulas. Conclus\u00e3o Os m\u00e9todos PUT e DELETE fazem parte do dia a dia de qualquer desenvolvedor Back-end. Sempre que um sistema precisa atualizar ou remover informa\u00e7\u00f5es, essas opera\u00e7\u00f5es entram em a\u00e7\u00e3o. Ao compreender como localizar registros, utilizar par\u00e2metros na URL, manipular objetos JavaScript e retornar respostas HTTP adequadas, voc\u00ea passa a entender o funcionamento interno de praticamente todas as APIs REST modernas. Embora nesta aula tenhamos utilizado apenas um vetor em mem\u00f3ria, toda a l\u00f3gica apresentada ser\u00e1 reaproveitada quando migrarmos para bancos de dados reais como MySQL e PostgreSQL, tornando essa uma das etapas mais importantes para quem deseja aprender desenvolvimento Back-end com JavaScript. O que voc\u00ea aprendeu nesta aula<\/p>\n","protected":false},"author":1,"featured_media":2227,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[21],"tags":[],"class_list":["post-2226","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript"],"_links":{"self":[{"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2226"}],"version-history":[{"count":2,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2226\/revisions"}],"predecessor-version":[{"id":2229,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2226\/revisions\/2229"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=\/wp\/v2\/media\/2227"}],"wp:attachment":[{"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/desvendandoocodigo.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}