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