O curso Express. js - Módulo 4: crie APIs RESTful com o Express | Shivendra Raghuvanshi | Skillshare
Pesquisar

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

O curso Express. js - Módulo 4: crie APIs RESTful com o Express

teacher avatar Shivendra Raghuvanshi, Lead Developer and Online Teacher

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução do curso

      2:10

    • 2.

      Visão geral desta seção

      0:56

    • 3.

      Projetando serviços RESTful com Express.js

      6:24

    • 4.

      Express.js: uma introdução

      2:24

    • 5.

      Construindo seu primeiro servidor Express.js

      5:41

    • 6.

      Desenvolvimento eficiente com Nodemon

      1:31

    • 7.

      Protegendo configurações com variáveis de ambiente

      3:15

    • 8.

      Roteamento dinâmico com parâmetros de rota

      3:38

    • 9.

      Dominando solicitações HTTP GET

      4:27

    • 10.

      Lidando com solicitações POST de forma eficaz

      3:41

    • 11.

      Testando endpoints com o Postman

      2:21

    • 12.

      Protegendo seu aplicativo com validação de entrada

      7:36

    • 13.

      A arte da solicitação HTTP PUT

      8:15

    • 14.

      Executando solicitações DELETE corretamente

      3:30

    • 15.

      Projeto: aplicativo FareWheels

      1:37

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

4

Estudantes

--

Projeto

Sobre este curso

Leve suas habilidades de desenvolvimento de backend para o próximo nível com o Módulo 4 da série "O curso Express.js" "Crie APIs RESTful com o Express". Neste módulo, você vai mergulhar profundamente na criação de APIs robustas e escaláveis usando o Express.js, uma das estruturas Node.js mais populares. Começando do básico, você vai aprender como projetar e implementar serviços RESTful que alimentam aplicativos web modernos.

Através de exemplos práticos, você vai construir seu primeiro servidor Express, proteger seu aplicativo usando variáveis de ambiente, dominar o roteamento dinâmico e lidar com solicitações HTTP como um profissional. Você também vai descobrir ferramentas essenciais como o Nodemon para desenvolvimento eficiente e o Postman para testar seus endpoints.

Ao final deste módulo, você terá uma base sólida no desenvolvimento de API RESTful, armado com habilidades como validação de entrada, tratamento de solicitações HTTP e proteção de sua API contra vulnerabilidades comuns. Quer você esteja construindo um projeto pessoal ou trabalhando em um aplicativo pronto para produção, este módulo vai equipar você com o conhecimento que você precisa para ter sucesso.

Conheça seu professor

Teacher Profile Image

Shivendra Raghuvanshi

Lead Developer and Online Teacher

Professor
Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução do curso: Bem-vindo de volta ao módulo quatro do curso Express JS, Bilrstful APIs with Esta aula é uma continuação da série de cursos Express JS Meu nome é Shan Ragunci e eu serei seu guia nesta emocionante jornada Com anos de experiência na criação APIs escaláveis e sistemas em tempo real, estou aqui para ajudá-lo a dominar a arte de criar APIs RESTful com o Express JS Neste módulo, abordaremos tudo. Você precisa criar APIs RESTful modernas e eficientes. Isso inclui projetar serviços RESTful e criar seu primeiro servidor Express S. Usando ferramentas como o Normon para agilizar desenvolvimento e carteiros para testar suas ABIs, protegendo seu aplicativo com variáveis de ambiente e validando entradas para mantê-lo seguro manipulando métodos SCTP como get post, put e delete para interagir com dados e dominando o roteamento dinâmico para tornar sua API flexível e o desenvolvimento e carteiros para testar suas ABIs, protegendo seu aplicativo com variáveis de ambiente e validando entradas para mantê-lo seguro, manipulando métodos SCTP como get post, put e delete para interagir com dados e dominando o roteamento dinâmico para tornar sua API flexível e poderosa. Essa classe é perfeita para desenvolvedores com uma compreensão básica do node JS. Quer dar o próximo passo no desenvolvimento de APIs. Se você sempre quis criar seus próprios serviços de back-end, este módulo mostrará exatamente como fazer isso Ao final deste módulo, você terá as habilidades para projetar e criar APIs RESTful que sejam seguras, escaláveis e prontas para produção Essas são habilidades essenciais para desenvolvedores de back-end e um passo fundamental para se tornar um especialista em full stack Por fim, nosso projeto prático o guiará na criação de uma API restful e totalmente funcional do zero Você criará rotas para lidar com solicitações de obtenção, publicação, colocação e exclusão, protegerá seu aplicativo com variáveis de ambiente e validará a entrada para garantir a confiabilidade Estou muito entusiasmado em ajudar você a criar APIs poderosas e escaláveis com o Express JS Vamos mergulhar e começar. Nos vemos na primeira palestra. 2. Visão geral desta seção: I Então, no início da seção dois, onde falamos sobre o sistema de módulos de nós, você aprendeu sobre esse módulo STDP. Usamos isso para criar um servidor web que escuta na porta 3.000 e responde às solicitações Então, os cursos raiz ou de API. Agora, embora essa abordagem esteja perfeitamente correta, ela não é ideal para criar um aplicativo complexo porque , em um aplicativo grande e complexo , podemos ter vários endpoints e não queremos incluir todas essas declarações nessa função Portanto, nesta seção, veremos o Express, que é uma estrutura rápida e leve para a criação de aplicativos web. Então, a seguir, veremos os serviços de repouso. 3. Projetando serviços RESTful com Express.js: Vamos começar esta seção uma breve introdução aos serviços Rest PL, também chamados de APIs RestPL Se você já sabe do que se trata o descanso, fique à vontade para pular este vídeo Então, no início do curso, apresentei a arquitetura cliente-servidor. Portanto, a maioria, se não todos, os aplicativos que usamos atualmente seguem essa arquitetura. O aplicativo em si é o cliente ou a parte frontal sob o capô. Ele precisa se comunicar com o servidor ou o back-end para obter ou salvar os dados. Essa comunicação ocorre usando o protocolo SDDV, o mesmo protocolo que alimenta nossa web Então, no servidor, expomos vários serviços que podem ser acessados por meio do STTBpTocol O cliente pode então ligar diretamente para esses serviços enviando STTPRquest Agora, é aqui que o descanso entra em cena. Rest é a abreviação de transferência de estado representacional. E eu sei que provavelmente não faz nenhum sentido para você porque foi apresentado por um estudante de doutorado como parte de sua tese Mas deixando a teoria de lado, o RST é basicamente uma convenção para criar esses serviços SDDB Por isso, usamos princípios simples do SGTPPtocol para fornecer suporte para criar, ler, atualizar e excluir dados Nós nos referimos a essas operações como operações brutas. Agora vamos explorar essa convenção usando um exemplo real de PAL. Digamos que temos uma empresa chamada Fair Wheels para alugar carros Temos um aplicativo cliente no qual gerenciamos uma lista de nossos clientes no servidor. Devemos expor o serviço em um endpoint como esse. Portanto, fairwheels.com reduz a API e reduz os clientes para que o cliente possa enviar o SGTBRquest com esse endpoint para falar com nosso serviço Agora, algumas coisas sobre esse endpoint que você precisa saber. Em primeiro lugar, o endereço pode começar com SGDP ou HTTPS. Isso depende da aplicação e de seus requisitos. Se você quiser que os dados sejam trocados em um canal seguro, você usaria GDPs Depois disso, temos o domínio do aplicativo. Em seguida, temos a API. Isso não é obrigatório, mas você vê muitas empresas seguirem essa convenção para expor seus Eles incluem a palavra API em algum lugar do endereço. Pode estar depois do domínio ou pode ser um subdomínio como apfairwals.com Não existe uma regra rígida e rápida. Depois disso, temos clientes, o que se refere à coleção de clientes em nosso aplicativo. No resto do mundo, nos referimos a essa parte como um recurso. Podemos expor nossos recursos, como clientes, carros e aluguéis, em vários terminais Portanto, esse é o nosso ponto final para trabalhar com os clientes. Todas as operações com clientes, como criar um cliente ou atualizar um cliente seriam feitas enviando uma solicitação STDB para esse endpoint O tipo da solicitação GTB determina o tipo da operação Portanto, toda solicitação do SGDP tem o que chamamos de verbo ou método que determina seu tipo ou intenção Aqui estão os métodos HTTP padrão. Temos get para obter dados, publicar para criar dados, colocar para atualizar dados e excluir para excluir dados Agora, vamos explorar cada um deles usando o exemplo de nossos clientes. Para obter a lista de todos os clientes, devemos enviar uma solicitação de obtenção de DST para esse endereço Observe o nome plural de clientes. Aqui, indica uma lista de clientes. Então, quando enviamos uma solicitação de STP get para esse endpoint, nosso serviço deve nos enviar algo assim Portanto, temos uma variedade de objetos de clientes. Se quisermos um único cliente, devemos incluir o ID desse cliente no endereço. Então, nosso servidor responderia com um objeto do cliente como esse. Agora, para atualizar um cliente, devemos enviar uma solicitação stdpPut para esse E observe que, novamente, aqui estamos especificando o ID do cliente a ser atualizado Mas também devemos incluir o objeto do cliente no corpo da solicitação. Portanto, essa é uma representação completa do objeto do cliente com propriedades atualizadas. Enviamos isso para o servidor, e o servidor atualiza o cliente com uma determinada ID de acordo com esses valores. Da mesma forma, para excluir um cliente, devemos enviar uma solicitação de exclusão STDP para esse Mas aqui não precisamos incluir o objeto do cliente no corpo da solicitação, pois tudo o que precisamos para excluir um cliente é uma ID. E, finalmente, para criar um cliente, precisamos enviar um StdpPostRquest para esse endpoint Não é isso aqui porque estamos adicionando um novo cliente. Não estamos lidando com um cliente específico. Não temos a identificação no endereço. Estamos trabalhando com uma coleção de clientes. Portanto, estamos publicando um novo cliente nessa coleção, e é por isso que devemos incluir o objeto do cliente no corpo da solicitação. O servidor obtém esse objeto e cria um cliente para nós. Portanto, essa é a convenção repousante. Expomos nossos recursos, como clientes, usando um endereço simples e significativo, e oferecemos suporte várias operações relacionadas a eles, como criá-los ou atualizá-los usando métodos GTP padrão Ao longo desta seção, você aprenderá a usar a estrutura expressa para criar o serviço RESTful para gerenciar a lista de clientes No entanto, nesta seção, não faremos nenhum trabalho com o banco de dados pois isso trará complexidade adicional. Nosso foco será exclusivamente na criação de serviços SDDP e usaremos uma matriz simples na memória para manter a lista de Posteriormente no curso, analisaremos o uso de um banco de dados. 4. Express.js: uma introdução: Então, aqui está a citação que escrevemos na seção sobre o núcleo do nó, onde eu apresento o módulo STDP. Então, podemos ver que, com o módulo STDP, podemos criar um servidor web Aqui temos uma função de retorno de chamada que usa dois parâmetros, solicitação e resposta E com esse objeto de solicitação, podemos verificar a URL da solicitação recebida Então, com isso, podemos definir várias rotas para nosso aplicativo. Então, se você tiver uma solicitação de, digamos, bolsas de API, é assim que responderemos ao cliente Agora, embora essa abordagem certamente funcione, ela não é muito sustentável porque, à medida que definimos mais rotas para nosso aplicativo, precisamos adicionar mais blocos I nessa função de retorno de chamada Então é aí que uma estrutura entra em cena. Uma estrutura fornece ao nosso aplicativo uma estrutura adequada, para que possamos adicionar facilmente mais rotas e, ao mesmo tempo, manter o código do aplicativo sustentável Agora, existem várias estruturas disponíveis para criar aplicativos e servidores web em cima do nó O mais popular é o Express. Então, se você acessar tonpmjs.com, vamos pesquisar vamos Portanto, a versão atual é a versão 4.18 0.2. Vamos dar uma olhada rápida aqui. Então, aqui no lado direito, veja as estatísticas. Foram mais de 27 milhões de downloads semanais. É uma estrutura muito popular. Também é muito rápido, leve e perfeitamente documentado. Agora, de volta ao terminal, vamos criar uma nova pasta para esta seção. Então eu vou chamar isso de Express Themo. Agora vamos entrar nessa pasta, executar o NPM nela com yes black Então, agora temos um pacote JcNfle e, finalmente, podemos instalar o Express Linda. Na próxima palestra, mostrarei como criar seu primeiro servidor web usando o Express 5. Construindo seu primeiro servidor Express.js: Tudo bem Agora, no código VS, vamos adicionar um novo aplicativo de arquivo dot js. Então, neste arquivo, primeiro, queremos carregar o módulo expresso. Então, usamos nossa função necessária, damos a ela o nome do nosso módulo, que é express. Agora, isso retorna uma função. Chamamos isso de expresso. Ok. Agora precisamos chamar essa função assim. E, como você pode ver, isso retorna um objeto do tipo express. Por convenção, chamamos esse objeto de aplicativo. Então, armazenamos o resultado em um aplicativo de chamadas constantes. Então, isso representa nosso aplicativo. Agora, esse objeto de aplicativo tem vários métodos úteis. Temos métodos como t, post, put e delete. Todos esses métodos correspondem aos verbos STDP ou aos métodos STTP sobre os quais falei anteriormente nesta Portanto, se você quiser lidar com uma solicitação de postagem de DDP em um endpoint, use app dot Agora, nesta palestra, queremos apenas usar o app dot G. Queremos implementar alguns endpoints que respondam a uma solicitação TDP Portanto, esse método usa dois argumentos. O primeiro argumento é o caminho ou a URL. Então, aqui, vou usar a barra para representar a raiz do site Agora, o segundo argumento é uma função de retorno de chamada. Essa é uma função que será chamada quando tivermos uma StdpgrQuest Ok, então essa função de retorno de chamada deve ter dois argumentos request e response Então isso vai para um bloco de código. Agora, esse objeto de solicitação tem várias propriedades úteis que nos fornecem informações sobre a solicitação recebida Se quisermos aprender sobre todas essas propriedades, é melhor consultar a documentação expressa porque, neste curso, usaremos apenas algumas dessas propriedades Então, acesse expresj.com na parte superior e veja a versão quatro de referência da API Agora, aqui, você pode ver o objeto da solicitação e, abaixo disso, você pode ver todas as propriedades que estão disponíveis para você. Temos URL base, corpo para ler o corpo da solicitação, cookies, nome de host novo, método IP, URL original, parâmetros e assim por diante. Então, voltando ao nosso código, quando recebermos uma solicitação GDP get na raiz do nosso site, responderemos com uma mensagem Hello world. Ponto de resposta CNN Hello WWW. Agora, é assim que definimos uma rota. Especificamos o caminho ou a URL e uma função de retorno de chamada, que também é chamada de manipulador de rotas Agora, finalmente, precisamos ouvir em uma determinada porta. Então, chamamos o app dot LICEN e atribuímos a ele um número de porta 3.000. E, opcionalmente, podemos passar uma função. Isso será chamado quando o aplicativo começar a ouvir no pote fornecido. Então, mais uma vez, usamos a sintaxe da função de seta para exibir algo no console Portanto, o log de pontos do console está escutando na porta 3.000. Agora, de volta ao aplicativo do nó terminal dot js. Ok, estamos ouvindo na porta 3.000. Agora, vamos mudar para o Cron e ir para a porta 3.000 do host local Então, aqui está nossa mensagem Hello world. Agora vamos definir outra rota. Então, mais uma vez, vamos chamar app dot cat. Agora, essa será a API slash slash CoorSS. Mais uma vez, passamos a função com dois argumentos que são solicitação e resposta, e isso vai para um bloco de código Agora, no cenário do mundo real, aqui queremos obter a lista de cursos do banco de dados e devolvê-los. Mas, como eu disse antes, nesta seção, nosso foco é puramente na construção desses endpoints Não vamos fazer nenhum trabalho de banco de dados, então vou simplesmente retornar uma matriz de números. Então, a resposta enviada passa por uma matriz de números livres. No futuro, podemos substituir esses números por objetos reais do curso. Agora, de volta ao terminal, temos que interromper esse processo e iniciá-lo novamente. Então pressione Control e C. Ok, mais uma vez, nota, aplicativo para perseguir. Agora, de volta ao Pro, vamos passar a cortar APIs OSS. Olha, temos uma série de números gratuitos. Linda. Então é isso que eu quero que você preste atenção aqui. Nesta implementação, não temos esses blocos I. Definimos novas rotas chamando app dot get. Com essa estrutura, à medida que nosso aplicativo cresce, podemos mover algumas dessas rotas para arquivos diferentes. Por exemplo, podemos mover todas as rotas relacionadas aos cursos para um arquivo separado, como courses dot JS. O Express dá à nossa aplicação um esqueleto, uma estrutura. 6. Desenvolvimento eficiente com Nodemon: Até agora, você notou que toda vez que fazemos uma alteração nesse código, precisamos voltar ao terminal, interromper esse processo e iniciá-lo novamente. Isso é muito tedioso. Então, eu vou te mostrar uma maneira melhor. Vamos instalar um pacote de nós chamado modo Nord, que é a abreviação de monitor de nós Então, no terminal, o NPM instala o G porque queremos instalá-lo globalmente, que possamos executá-lo em qualquer lugar E o nome do pacote é Nord Mode. Como eu disse antes, se você estiver no Mac e não tiver configurado as permissões corretamente, precisará colocar o pseudo na frente Tudo bem? O modo Non está instalado. Então, com isso, em vez de executar nosso aplicativo usando o node, usamos o node mode. Está bem? Agora você pode ver que Normon está vendo todos os arquivos nesta pasta, qualquer arquivo com qualquer extensão Então, se você voltar aqui e fizer uma alteração simples e depois salvar o arquivo. Agora, veja, no terminal, o Normon reiniciou nosso aplicativo ou nosso processo devido às mudanças Portanto, não precisamos mais fazer isso manualmente. Agora, de volta ao navegador, se enviarmos uma solicitação para a raiz do site, podemos ver nossa nova mensagem exibida aqui. 7. Protegendo configurações com variáveis de ambiente: Agora, uma coisa que precisamos melhorar nesse código é esse valor codificado para a porta Então, usamos 3.000 como um número arbitrário. Embora isso possa funcionar na máquina de desenvolvimento, é improvável que funcione em um ambiente de produção. Porque quando você implanta esse aplicativo um ambiente de hospedagem, a porta é atribuída dinamicamente pelo ambiente de hospedagem Portanto, não podemos contar com a disponibilidade de 3.000. Então, a maneira de corrigir isso é usando uma variável de ambiente. Normalmente, em ambientes de hospedagem para aplicativos de nós, temos essa variável de ambiente chamada porta. Uma variável de ambiente é basicamente uma variável que faz parte do ambiente no qual um processo é executado. Seu valor é definido fora desse aplicativo. Eu vou te mostrar como isso funciona em um segundo. Portanto, neste aplicativo, precisamos ler o valor dessa variável de ambiente esportivo. E a forma como fazemos isso é usando o objeto de processo. Temos esse objeto global chamado processo. Esse objeto tem uma propriedade chamada N, que é a abreviação de variáveis de ambiente. E depois disso, adicionamos o nome da nossa variável de ambiente. Nesse caso, para isso se isso estiver definido, vamos usar isso. Caso contrário, usaremos 3.000. Agora podemos armazenar o resultado em uma constante chamada port. Ok, vamos deletar isso. E, finalmente, precisamos substituir 3.000 porta e também alterar nossa mensagem de acordo Então, vou substituir esse código único por um backtick. Portanto, podemos usar um modelo literal. E aqui vamos substituir 3.000 por um valor dinâmico Então, adicionamos Dosina, chaves de curry e, em seguida, adicionamos Agora, de volta ao terminal, vamos executar esse aplicativo usando o modo Node. Então, nesta máquina, você pode ver, eu não tenho uma variável de ambiente chamada porta. É por isso que 3.000 são usados como porta para o servidor web. Agora vou definir uma variável de ambiente. Então, vamos interromper esse processo. No Mac, podemos definir uma variável de ambiente executando o comando export Se estivermos no Windows, você deve usar set no prompt de comando e dólar e dois-pontos no Power Shell Agora, adicionamos o nome da variável de ambiente nesse caso, porta e definimos seu valor. Vou usar 5.000. Então, agora temos essa variável de ambiente chamada porta com um valor de 5.000. Com isso, executamos esse aplicativo, Norman, você pode ver que agora estamos ouvindo na porta 5.000 Portanto, essa é a maneira correta de atribuir uma porta aos aplicativos do seu nó. Você deve tentar ler o valor de uma variável de ambiente chamada port. Se houver um valor, você deve usá-lo. Caso contrário, use um número arbitrário para sua máquina de desenvolvimento 8. Roteamento dinâmico com parâmetros de rota: Tudo bem, atualmente, temos uma rota para obter a lista de cursos. Agora, nesta palestra, mostrarei como criar uma rota para obter um único curso Então, no início desta seção, onde falei sobre serviços RESTful, você aprendeu que, para obter um único curso, devemos incluir o ID do curso na URL Portanto, o endpoint deve ser como esse CSS da API de barra. Supondo que um seja o ID do curso. Então, vamos ver como podemos implementar uma rota como essa. Então, app dot get, adicionamos o caminho que é slash API slash Courses Agora, aqui precisamos definir um parâmetro. Então, adicionamos coluna e ID. Esse ID é o nome do nosso parâmetro. Aqui poderíamos usar qualquer coisa. Não precisa ser um documento de identidade. Pode ser o ID do curso, mas o ID é mais curto e mais convencional. Agora, adicionamos nossa função de manipulador de rotas. Então, a solicitação e a resposta vão para. Agora, para ler esse parâmetro, usamos formulários de ponto de solicitação ID de ponto. Então, por enquanto, vamos enviar isso para o cliente. Então, ponto de resposta N. Ok. De volta ao navegador. Agora vamos passar para o slash API COSSSO. Então você pode ver que lemos com sucesso o valor desse parâmetro. Além disso, é possível ter vários parâmetros em uma rota. Por exemplo, imagine que você está criando um serviço para alimentar um bloco, que pudéssemos ter uma rota como esta para publicar seu mês Portanto, temos dois parâmetros. E com isso, podemos obter todas as postagens de um determinado mês e ano. Agora podemos ler esses parâmetros exatamente como antes. Portanto, solicite pontos PRMs por ano ou mês. Para esta demonstração, deixe-me mostrar essa solicitação dot PremsObject. De volta ao navegador. Agora vamos passar para a API após 2023 e uma. Portanto, esse é nosso objeto PAMs de solicitação. Temos duas propriedades por mês, e elas são nomeadas com base em nossos parâmetros de rota. Com o Express, também podemos obter parâmetros de sequência de caracteres de consulta. Esses são parâmetros que adicionamos na URL após um ponto de interrogação. Por exemplo, podemos obter todas as postagens em janeiro de 2023 e classificá-las pelo nome. Então, adicionamos um ponto de interrogação, classificamos por definir esse nome. Esse é um parâmetro de sequência de caracteres de consulta. Usamos parâmetros de sequência de caracteres de consulta para fornecer dados adicionais aos nossos serviços de back-end. Portanto, usamos parâmetros de rota para valores essenciais ou obrigatórios, enquanto usamos parâmetros de sequência de caracteres de consulta para qualquer coisa que seja ideal. Agora, deixe-me mostrar como ler os parâmetros da sequência de caracteres de consulta. Então, de volta ao código VS, em vez de solicitar Dot PRMs, usamos request dot query, save back no Chrome, e é isso que obtemos Portanto, os parâmetros de consulta são armazenados em um objeto com vários pares de valores-chave. 9. Dominando solicitações HTTP GET: Eu estou bem. Agora vamos implementar um novo endpoint para obter um único curso do servidor Então, primeiro de tudo, vamos mudar isso de volta para cursos e adicionar o parâmetro ID aqui. Ok, agora na parte superior, vamos definir uma matriz chamada cursos. Então, cursos constantes. Definimos isso como uma matriz. E nessa matriz, teremos três objetos do curso. Portanto, cada objeto deve ter algumas propriedades, ID e nome. E, claro, podemos ter mais. Mas, para simplificar, vou me limitar a duas propriedades aqui. Ok, agora vamos duplicar essa linha e alterar os IDs, bem como o nome dois e três Então, temos dois pontos finais, um para obter todos os cursos e outro para obter um único curso, certo? Na primeira, retornaremos nossa matriz de cursos. Está bem? Agora, no segundo, devemos escrever alguma lógica para procurar o curso com um determinado ID. Então, deixe-me deletar isso. Primeiro vamos aos cursos dot FIE. Esse é um método que está disponível em todas as matrizes em JavaScript. Como argumento para esse método, precisamos passar uma função. Essa função será usada para encontrar um curso que corresponda a um determinado critério. Então, usamos a sintaxe da função de seta. T vai para, e aqui escrevemos uma lógica que retorna um valor booleano Esse valor booleano determina se esse curso é o que estamos procurando Portanto, C ID deve ser igual a request dot proms dot ID. No entanto, essa solicitação de Pam ID retorna uma string. Então, para que essa comparação funcione corretamente, precisamos passar essa string para um número inteiro Então, chamamos pasen, que é uma das funções globais disponíveis em Javascript, e então obtemos o resultado e o armazenamos em uma constante chamada quote Agora podemos usar let ou constant. Usamos let se você quiser definir uma variável que possamos redefinir posteriormente e usamos constant se quisermos definir uma constante. Nesse caso, não quero redefinir o curso posteriormente nesta função, mas, novamente, é perfeitamente normal usar let here também. É apenas uma preferência pessoal. Nós obtemos o objeto do curso. Agora, se esse curso não tiver um valor, ou seja, se não encontrarmos um curso com um determinado ID, por convenção, devemos retornar uma resposta com o código de status do TDP de quatro ou quatro Isso significa que o objeto não foi encontrado. Portanto, essa é uma das convenções das ABIs tranquilas. Se o cliente solicitar um recurso, mas esse recurso não existir no servidor, devemos retornar uma resposta com um código de status de quatro ou quatro. Portanto, retorne o status de ponto de resposta quatro ou quatro e, otimamente, também podemos enviar uma mensagem ao cliente Portanto, enviar o curso com um determinado ID não foi encontrado. Está bem? Agora, caso contrário, se tivermos um ID do curso com esse ID, simplesmente o devolveremos ao cliente. Então, o ponto de resposta é um curso. Agora vamos testar isso. B no navegador, vamos até slash API slash courses slash one Portanto, temos um curso com ID um, e é por isso que obtemos esse objeto SN na resposta. Ok, se eu mudar para dez, nós recebemos esta mensagem. O curso com um determinado ID não foi encontrado. E para garantir que o código de status dessa resposta seja quatro ou quatro, podemos abrir a partir das ferramentas do desenvolvedor. Então, clique com o botão direito do mouse em Limpar, vá para inspecionar. Em seguida, na guia Rede, verifique se você não tem um filtro aqui, selecione tudo e atualize a página pressionando Control R no Windows ou Command R no Mac Então, aqui está uma solicitação que enviamos para o servidor. Você pode ver que o código de status é quatro ou quatro, o que significa não encontrado. 10. Lidando com solicitações POST de forma eficaz: Até agora, criamos duas rotas que respondem ao STTPGRQuest E usamos essas rotas para obter todos os cursos, bem como um único curso. Nesta palestra, vou te ensinar como responder ao STTPPostRquest Então, usamos uma solicitação de postagem TTP para criar um novo curso, então app dot post Em vez do método G, usamos o método post. Agora, semelhante ao método G, precisamos especificar um aplicativo. Então, isso deve ser uma barra CSS do EBS, porque vamos postar com uma coleção de cursos É por isso que eu uso um nome plural aqui. Então, precisamos do nosso manipulador de rotas, então a solicitação e a resposta vão para o cartão preto Nesse manipulador de rotas, precisamos ler o objeto do curso que deve estar no corpo da solicitação Use suas propriedades para criar um novo objeto de curso e , em seguida, adicionar esse objeto de curso à nossa matriz de cursos. Vamos criar um novo objeto do curso. Curso constante. Novamente, estou usando uma conste porque não vamos redefinir esse objeto de curso posteriormente Então, vamos definir isso para um novo objeto. Agora, aqui, como não estamos trabalhando com um banco de dados, precisamos atribuir manualmente um ID. Então, identifique, e obtemos o número de elementos em nossa matriz de cursos, ou seja, o comprimento dos pontos dos cursos, e simplesmente adicionamos um a ele. No futuro, quando trabalharmos com um banco de dados, o ID será atribuído pelo banco de dados. A seguir está a propriedade do nome. Agora precisamos ler isso no corpo da solicitação. Portanto, solicite dot body dot Name. Então, aqui estou assumindo que no corpo do ponto da solicitação, temos um objeto e esse objeto tem uma propriedade de nome Agora, para que essa linha funcione, precisamos habilitar a análise de objetos JSN no corpo da solicitação porque, por padrão, esse recurso não está habilitado no Express Então, na parte superior, depois de obtermos o objeto app, precisamos chamar app.us e aqui chamamos express dot Agora, isso pode parecer um pouco estranho ou desconhecido para você, mas não se preocupe Posteriormente nesta seção, vamos explorar isso em detalhes. Basicamente, o que estamos fazendo aqui é adicionar um middleware Então, quando chamamos o método Express Jin, esse método retorna um middleware E então chamamos o aplicativo para usar esse middleware no pipeline de processamento de solicitações Novamente, vamos explorar isso em detalhes posteriormente nesta seção. Então, voltando ao nosso novo manipulador de rotas, temos um objeto de curso Em seguida, nós o inserimos em nossa matriz, então os cursos impulsionam o curso. E, finalmente, por convenção, quando publicamos um objeto no servidor, quando o servidor cria um novo objeto ou um novo recurso, você deve retornar esse objeto no corpo da resposta. Então, o ponto de resposta é um curso. A razão para isso é que, porque estamos atribuindo esse D no servidor, precisamos retornar esse objeto do curso ao cliente porque é provável que o cliente precise saber o ID desse novo objeto ou desse novo recurso Então é assim que lidamos com a solicitação HTTP post. Na próxima aula, mostrarei como testar esse endpoint 11. Testando endpoints com o Postman: Tudo bem, para chamar os serviços do SDDP, vamos usar a API do Postman Então, se você nunca usou o Postman antes, postman.com e baixe o aplicativo em seu sistema Então, no canto superior direito, acesse o download para começar a baixar o produto. Depois de baixado, abra esse arquivo e instale-o em seu sistema desta forma. Uma vez feito isso, você pode abrir Postman como qualquer outro aplicativo em seu sistema Agora, aqui, ele pode pedir que você se inscreva em uma conta, mas você não precisa fazer isso. Como estamos trabalhando localmente, podemos usar um Scratchpad, tudo Agora, nesta página, podemos criar uma nova solicitação TTB. Então, a partir desse menu suspenso, definimos o tipo para uma solicitação de postagem. Você coloca o URL aqui. Nesse caso, isso é TDP, host local. Na minha máquina, estou usando a porta 3.000 para hospedar esse aplicativo, APIs Courses Agora precisamos definir o corpo dessa solicitação a partir dessa lista, selecionar Pro e depois JSN Então, com isso, podemos colocar um objeto JSN no corpo da solicitação Então, vamos adicionar um objeto aqui e dar a ele o nome de estupro. Por nome, definimos isso como um novo curso e, finalmente, definimos. Você pode ver que o status dessa solicitação é 200, que significa que a solicitação foi tratada com sucesso E aqui está o corpo da resposta. Então, o ID é quatro porque agora temos quatro cursos em nossa matriz, e esse é o mesmo nome que enviamos para o servidor. Então é assim que testamos serviços HTTP usando o Postman. Agora, nessa implementação, presumimos que há um objeto com uma propriedade de nome no corpo da solicitação. E se o cliente esquecer de enviar essa propriedade ou enviar um nome inválido, talvez um nome muito curto. É aí que a validação de entrada entra em cena, e esse é o tópico da próxima palestra. 12. Protegendo seu aplicativo com validação de entrada: Nesta palestra, mostrarei como fazer a validação de entradas Portanto, como prática recomendada de segurança, você nunca deve confiar no que o cliente lhe envia. Você deve sempre validar a entrada. Então, neste exemplo específico, como estamos lidando com um objeto simples com apenas uma propriedade que é nome, podemos escrever uma lógica de validação como essa. Então, eu solicito que o nome do ponto do corpo do ponto não exista ou solicito exista ou solicito que o comprimento do nome do ponto do corpo do ponto seja menor que três, então retornaremos um erro ao cliente. A convenção RESTful é retornar uma resposta com o código de status 400 Isso significa solicitação do PAD. Então, para fazer isso, chamamos response dot status 400 e, em seguida, podemos enviar uma mensagem de erro. Nesse caso, podemos escrever uma mensagem de erro genérica, como nome é obrigatório e deve ter no mínimo três caracteres. Agora, em sua implementação, talvez você queira diferenciar os erros Por exemplo, se o cliente não enviou o nome da propriedade, talvez você responda dizendo que o nome é obrigatório. Ou se eles enviassem o nome, mas o nome não fosse longo o suficiente, você poderia enviar uma mensagem de erro diferente. Então, finalmente, voltamos aqui porque não queremos que o resto da função seja executado. Essa é uma ideia básica. No entanto, em aplicações do mundo real, é mais provável que você esteja trabalhando com um objeto complexo, algo mais complexo do que este objeto do curso aqui. Você não quer escrever uma lógica de validação complexa como essa no início do seu manipulador de rotas Então, deixe-me apresentar um pacote de nós que facilita muito a validação da entrada Então, no Google, se você pesquisar por NPM Joy with I, veja, aqui está o primeiro link Então, aqui você pode ver que há mais de 8 milhões de downloads semanais. É um pacote muito popular. Agora, deixe-me mostrar como substituir essa lógica de validação pela Joy. Então, primeiro, de volta ao terminal, vamos instalar o Joy. No momento da gravação deste vídeo, a versão mais recente é a versão 17.9 0.2 Se você quiser ter certeza de que temos exatamente a mesma experiência que mostrarei neste vídeo, instale essa versão exata. Então, o NPM instala agora em 17.9 0.2, ok? Agora, de volta ao código na parte superior, precisamos carregar esse módulo. Portanto, exija Joy, obtenha o resultado e armazene-o em uma constante chamada Joy with J porque o que está escrito neste módulo é uma classe. E, como eu disse antes, em JavaScript, usamos a convenção de nomenclatura pascal para nomear nossas classes Portanto, a primeira letra de cada palavra deve estar em maiúscula. Além disso, como prática recomendada, coloque toda a pausa necessária sobre esse arquivo Dessa forma, você pode ver facilmente quais são as dependências desse módulo Portanto, esse módulo de aplicativo depende de dois módulos. Um é Joy, o outro é Express. Agora temos essa classe Joy de volta em nosso gerenciador de rotas. Agora, com Joy, primeiro, precisamos definir um esquema Um esquema define a forma dos nossos objetos. Quais propriedades temos nesse objeto? Qual é o tipo de cada propriedade? Temos um e-mail? Temos uma corda? Qual é o número mínimo ou máximo de caracteres? Temos um número? Em que intervalo esse número deve estar? Portanto, esse é um trabalho do Schema. Então, aqui, primeiro vou definir um esquema. No esquema enviado, nós o configuramos como um objeto. Essa é a forma do objeto do nosso curso. Então, aqui queremos ter uma propriedade de nome e a definimos como Joy dot string. Então, estamos dizendo a Joy que isso é uma string, que deve ter no mínimo três caracteres e deve ser obrigatória. Portanto, ele tem uma API muito fluente. Novamente, você pode consultar a documentação para ver todos os métodos disponíveis para você. Então, aqui está nosso esquema. Agora chamamos o esquema dot Validate e fazemos a solicitação no corpo Agora, esse método de validação retorna um objeto. Vamos armazenar isso em uma constante chamada resultado. Para esta demonstração, vou registrar esse resultado no console. Então, antes de prosseguirmos, digamos isso, volte para o carteiro Vamos criar outro curso. Agora, de volta ao terminal. Então esse é o nosso objeto de resultado. Ele tem duas propriedades, erro e valor. Somente um deles pode ter um valor. Então, nesse caso, como enviamos um objeto de curso válido, temos esse objeto aqui como um valor da propriedade value. Se você enviar um objeto inválido, o valor será nulo e erro será definido. Deixe-me te mostrar. Então, coloque os carteiros, vamos remover o nome da propriedade Envie agora de volta para o terminal. Ok, olha, aqui está o objeto resultante. Essa é a propriedade do erro. É definido como um objeto que tem erro de validação. O nome é obrigatório. Então, voltando ao manipulador de rotas, em vez dessa lógica de validação manual, podemos verificar o valor da propriedade result thot error. Então, se resultar esse erro, enviaremos uma resposta com o código de status de 400 e no corpo da resposta. Por enquanto, podemos simplesmente adicionar o erro do ponto de resultado, ok? E você não precisa mais desse registro de pontos do console. Diga. Agora, de volta ao Postman, mais uma vez, vou enviar esse objeto vazio Agora, veja a resposta. Então é isso que obtemos. Um objeto com essas propriedades. Detalhes originais, que são uma série de mensagens de erro. Então, aqui está a primeira mensagem. O nome é obrigatório. Agora, esse objeto é muito complexo para enviar o tipo. Talvez você queira simplificar isso. Então, de volta ao código, uma solução simples é acessar a matriz de detalhes, obter o primeiro elemento e, seguida, acessar a propriedade da mensagem. Então, em vez de usar o primeiro elemento, talvez você queira acessar todos os elementos dessa matriz, obter suas propriedades de mensagem e concatená-los Isso depende inteiramente de você. Então, economize mais uma vez, vamos enviar uma solicitação inválida e agora obtemos o nome obrigatório Se você acessar nossa solicitação e adicionar a propriedade name, mas enviá-la para uma string com apenas um caractere, agora obteremos um erro diferente. O tamanho do nome deve ter pelo menos três caracteres. Assim, você pode ver que o Joy facilita muito a validação da entrada e o retorno mensagens de erro adequadas para o cliente 13. A arte da solicitação HTTP PUT: Tudo bem Agora vamos ver como podemos atualizar um curso. Vamos adicionar um novo aplicativo de gerenciamento de rotas. Usamos o método put para atualizar recursos. Agora, a parte deve ser slash API slash Courses. E aqui precisamos de um parâmetro de rota porque estamos lidando com um curso específico. Então, ID, agora a função do manipulador de rotas, solicitação e a resposta vão para um quod black Tudo bem Agora, aqui está a lógica que precisamos implementar. Primeiro, precisamos pesquisar esse curso com um determinado ID. Então, procure o curso. Se o curso não existir, se não existir, precisamos retornar quatro ou quatro. Isso significa que o recurso não foi encontrado. Caso contrário, precisamos validar o curso, garantir que ele esteja em boas condições. Se válido, precisamos retornar um erro 400, que significa solicitação de Pat Se você chegar aqui, isso significa que está tudo bem. Então, atualizamos o curso e devolvemos o curso atualizado ao cliente. Essa é uma lógica que precisamos implementar. Já temos alguns códigos que podemos reutilizar aqui. Não vou digitar tudo à mão. Vou copiar alguns códigos de nossos outros manipuladores de rotas Primeiro, queremos pesquisar o curso e, se ele não existir, queremos retornar um erro de quatro ou quatro. Para isso, vou até esse outro manipulador de rotas, onde obtemos um único curso Essa é uma lógica na qual estamos interessados. Procuramos o curso e, se ele não existir, retornamos um erro de quatro ou quatro. Então, copie essas duas linhas, terminamos com a primeira parte. A segunda parte é sobre validação. Para isso, vou até nosso terminal de postagem. Então, aqui precisamos copiar o esquema, bem como essa linha para validar o corpo da solicitação usando joy e o código para retornar 400 se for inválido Mas há um problema com essa abordagem. O problema é que, nesse caso, temos um esquema muito simples E se você estiver lidando com um objeto complexo com algumas propriedades? Então, nossa lógica de validação seria duplicada em diferentes rotas e cargas Então, vamos copiar o barco por enquanto e depois voltaremos e o refatoraremos para torná-lo melhor Então copie essas linhas e cole aqui. Então, estamos validando e, se você tiver um erro no resultado, retornaremos esse erro 400 Então essa é a nossa segunda parte. Temos o esquema, validamos e, se tivermos um erro, retornamos o erro 400 Terminamos com a segunda parte. Agora, a terceira parte. Então, neste momento, temos um objeto de curso. Podemos atualizar suas propriedades, então, claro, não, configuramos isso para solicitar dot p dot. E, claro, se tivermos outras propriedades, também as definiremos aqui. Então, terminamos de atualizar o curso e, finalmente, precisamos devolver o curso atualizado ao cliente. Curso Response dot CN. É assim que lidamos com um StDBPutrQuest. Agora, eu lhe disse que duplicamos essa lógica de validação Vou extrair essas poucas linhas em uma função separada que podemos reutilizar tanto neste manipulador de rotas para lidar com um STTPPutRQuest quanto na outra que escrevemos na última aula para criar um essas poucas linhas em uma função separada que podemos reutilizar tanto neste manipulador de rotas para lidar com um STTPPutRQuest quanto na outra que escrevemos na última aula para criar um curso. Agora vamos definir uma função aqui e chamá-la de validar curso Nós damos a ele um objeto de curso. Agora, nesta função, devemos ter o esquema e essa linha para validar o curso Então corte essas poucas linhas e cole aqui. Agora, em vez de validar o corpo do ponto da solicitação, vamos validar o argumento que é passado para esse método, forma que seja o objeto do curso Finalmente, podemos simplesmente retornar esse resultado para a chamada. Não há necessidade de definir uma constante. Então, com essa nova implementação, temos toda a lógica de validação em um só lugar. Agora podemos reutilizar isso Então, aqui está nosso método de venda. Definimos um resultado de chamada constante e o configuramos para validar o curso E como argumento, passamos o corpo do ponto da solicitação. Agora podemos tornar esse código um pouco mais limpo e curto usando o recurso de desestruturação de objetos no Javascript moderno. Então, veja, aqui obtemos esse objeto de resultado e estamos acessando a propriedade de erro do ponto de resultado em dois lugares diferentes. Como tudo o que nos interessa é essa propriedade de erro, podemos obtê-la usando a reestruturação de objetos Então, deixe-me duplicar essa linha e mostrar como funciona a desestruturação de objetos Com a reestruturação de objetos, ao declarar uma variável ou constante, adicionamos culebrass e, em seguida, adicionamos aqui a propriedade do Portanto, nesse caso, o objeto de destino que é retornado do nosso método de curso válido tem duas propriedades, erro e valor. Nesse caso, queremos apenas a propriedade error. Então, colocamos isso entre chaves Cul. Portanto, isso é equivalente a obter um erro de ponto de resultado. Usamos essa notação. OK. Agora, com isso, não precisamos repetir o erro do resultado em lugares diferentes. Podemos simplesmente usar o erro, ok? Então, isso é desestruturação de objetos. Agora não precisamos mais dessa primeira linha. E, finalmente, antes de terminarmos esta palestra, precisamos fazer mais uma alteração nesse código Portanto, precisamos usar essa nova forma de validar um curso no manipulador de rotas para lidar com nossa solicitação de postagem STTP Então, copie, este é o nosso manipulador para criar um novo curso. Portanto, não precisamos usar o esquema aqui. Movemos toda essa lógica para nossa função de validação do curso. Vou deletar isso e criar o código que copiamos do outro método Por isso, chamamos validate course, usamos a sintaxe de reestruturação de objetos e, se você tiver um erro, retornamos a resposta 400 ao cliente Agora, finalmente, vamos testar nosso novo endpoint para atualizar um curso Agora, de volta ao Postman, precisamos alterar o tipo dessa solicitação STDP para colocar, alterar a URL e adicionar uma ID de curso válida, como uma Aqui temos um objeto de curso válido com o nome definido como novo curso. Por isso, recebemos uma resposta de 200 que bem-sucedida e aqui está o curso atualizado. Portanto, se você abrir uma nova guia e enviar uma solicitação de TPG para cursos de APIs localizados, verá a lista de nossos Primeiro curso, seu nome é atualizado. Perfeito. Agora, vamos testar os outros cenários. E se enviarmos um documento de identidade inválido? Nós dez. Enviar o curso com um determinado ID não foi encontrado, e você pode ver que a resposta é quatro ou quatro, o que significa que não foi encontrado. Por fim, e se enviarmos um ID de curso válido , mas um objeto de curso inválido Então, vou remover a propriedade do nome, S, para que possamos ver que temos uma solicitação inválida ou um erro 400. E aqui está a mensagem de erro. O nome é obrigatório. A seguir, mostrarei como lidar com a solicitação de exclusão do SDDP. 14. Executando solicitações DELETE corretamente: E de todas as operações de CRD que implementamos, criamos, lemos e atualizamos Portanto, nesta palestra, mostrarei como responder à solicitação de exclusão do HTDP. É muito simples e semelhante ao que fizemos até agora. Então, aqui está nosso objeto de aplicativo. Chamamos esse método de exclusão. Escolha um caminho que seja slash API Courses. E, claro, precisamos de um parâmetro porque estamos trabalhando com um curso específico. Em seguida, nossa solicitação e resposta do manipulador de rotas vão para o bloco Cord Agora, aqui, primeiro, precisamos pesquisar o curso, um curso com um determinado ID. Se não existir, precisamos retornar quatro ou quatro. Caso contrário, vamos excluí-lo. E, por convenção, retorne o mesmo curso, o curso que foi excluído. Então, novamente, vou pegar emprestado algum código de outros manipuladores de rotas para pesquisar o curso e retornar um erro de quatro em quatro Deixe-me voltar ao nosso manipulador de rotas para a solicitação de colocação do STP. Portanto, essas duas primeiras linhas servem para pesquisar o curso e retornar um erro de quatro em quatro. Então, copie essas duas linhas aqui. Essa é a nossa primeira parte. Agora, para excluir um curso, primeiro precisamos encontrar o índice desse curso em nossa matriz de cursos. Então, índice de pontos dos cursos, é claro, obtemos o índice, armazenamos em uma constante e, em seguida, podemos usar o método de emenda, remover um objeto da nossa matriz de cursos Então, cursos dot Splice, vamos até esse índice e removemos um objeto Portanto, essa é uma parte excluída. E, finalmente, precisamos devolver a resposta à reclamação. Então, resposta que envia esse objeto do curso. Agora, vamos testar isso. Bag in Postman, vamos trocar de colocar para excluir. Primeiro, quero enviar um ID de curso inválido, como dez s, para que obtenhamos um erro de quatro ou quatro, não encontrado nessa mensagem Perfeito. Agora vamos deletar a primeira bolsa. Curso com ID 1. Em seguida, obtemos o mesmo objeto do curso na resposta. E se formos para nossa segunda guia onde temos a lista de nossos cursos, vamos enviá-la mais uma vez. Ok, agora, olha, não temos mais nossa primeira bolsa. Só temos cursos com identificação dois e três. Tudo bem. Antes de prosseguirmos, consulte o manipulador para responder à solicitação put Se houver um erro, uma forma mais curta de escrever o mesmo código é colocar o retorno aqui, e então não precisamos de um bloco de código. Podemos colocar tudo em uma linha. Agora, finalmente, vamos dar uma olhada no manipulador da solicitação de postagem do GDP Aqui está. Novamente, vou usar a mesma técnica para limpar esse código. Portanto, se tivermos um erro, simplesmente retornamos e eliminamos o ruído extra nesse código. Isso é muito melhor. 15. Projeto: aplicativo FareWheels: Tudo bem Agora é hora de fazer exercícios. Então, a partir desta palestra, começaremos a criar os serviços de back-end para nosso aplicativo Fair Wheels Como eu disse antes, fair wheels é um serviço imaginário para alugar carros. Então, ao longo deste curso, vamos construir a parte traseira de Fair Wheels pouco a pouco. Nossa primeira tarefa é criar um serviço para gerenciar a lista de montadoras ou fabricantes. Portanto, cada carro tem um fabricante como General Motors, Tesla, Ord e assim por diante Devemos ter um endpoint para obter a lista de todas as empresas, porque em algum lugar do nosso aplicativo cliente, talvez tenhamos uma lista suspensa para o usuário selecionar uma empresa Portanto, precisamos de um endpoint para obter todas as empresas. Também devemos ser capazes de adicionar uma nova empresa, bem como atualizar ou excluir uma existente. Portanto, antes de prosseguir, quero que você coloque em prática o que aprendeu até agora, e essa também será sua tarefa Portanto, mesmo que você seja um desenvolvedor experiente, não diga não nem invente uma desculpa Eu sei como fazer isso. Isso é tão fácil. Eu sei que é fácil, mas o que importa agora é que eu quero que você se acostume com essa sintaxe Então vá em frente, comece um novo projeto do zero, todas as rodas, e crie esse serviço TDP para gerenciar a lista de empresas