- NodeJS
- API
- HTTP
- Request
- Métodos HTTP
- Response
- Código de status
- Padrão REST
- Módulos
- NodeJS como servidor
- Query Params
Primeiramente, é importante ressaltar que NodeJS não é uma linguagem de programação, mas sim uma plataforma ou runtime que permite a execução de Javascript no servidor.
O NodeJs utiliza um interpretador de código chamado de V8 que converte o código em JavaScript em código executável pela máquina.
Para executar o código, é utilizado uma Call Stack que atua como uma pilha de processamento de códigos, onde o primeiro a entrar é o último a sair.
Apesar de suportar operações de entrada e saída assíncronas (non-blocking I/O) e ser capaz de executar código de forma assíncrona, o NodeJS possui apenas uma call stack, o qeu significa que ele executa apenas um código por vez. No entanto, ele possui um gerenciador de eventos que permite a execução de vários códigos simultaneamente.
O NodeJS utiliza a libuv, que implementa a Thread Pool e o Event Loop, possibilitando assim, a execução de códigos assíncronos.
A Thread Pool processa operações que são mais demoradas e que bloqueariam o uso da call stack.
As Callback Queues funcionam com o método FIFO (First In, First Out), ou seja, a primeira função a entrar é a primeira a sair. Elas são funções que são executadas após a conclusão de uma operação assíncrona. Elas trabalham em conjunto com o Event Loop, que verifica se a call stack está vazia para executar a próxima função.
API é a sigla para Application Programming Interface. Ela permite a conexão de várias aplicações e serviços de diferentes tipos, de forma padronizada e estruturada, em uma mesma fonte de dados.
Ela define um conjunto de regras e endpoints (pontos de acesso) que os desenvolvedores podem utilizar para interagir com o sistema ou serviço que disponibiliza a API.
HTTP é a sigla para Hypertext Transfer Protocol, ou seja, Protocolo de Transferência de Hipertexto. Ele é um protocolo de comunicação que permite a transferência de informações na internet entre clientes e servidores.
O Request é a requisição feita pelo cliente ao servidor. Ela é formada por blocos de informação que são enviados pelo cliente ao servidor. Esses blocos são::
-
URL/endpoints: é o endereço do servidor e o caminho para o recurso que o cliente deseja acessar. Ou seja, é a identificação de recursos.
-
Query Params: são parâmetros que são enviados na URL após o símbolo de interrogação (?). Eles são utilizados para filtrar, ordenar e paginar os dados.
Exemplo: http://localhost:3333/users?name=Gabriel&idade=20
-
Método: Identifica o tipo de requisição que está sendo feita. Os principais métodos são: GET, POST, PUT, DELETE.
-
Headers: São informações adicionais que podem ser enviadas na requisição. Exemplo: Content-Type, Authorization, Accept, etc.
-
Body: É o corpo da requisição. É utilizado para enviar dados para serem criados ou atualizados. O body é utilizado apenas nos métodos POST e PUT, geralmente, em formato JSON.
Os métodos HTTP são utilizados para indicar a ação que está sendo realizada no recurso. Os principais métodos são:
-
GET: Utilizado para consulta de informações do servidor.
Exemplo: GET /users Exemplo: GET /users/1
-
POST: Utilizado para criar novas registros no servidor.
Exemplo: POST /users/1
-
PUT: Utilizado para alteração de registros no servidor.
Exemplo: PUT /users/1
-
DELETE: Utilizado para deletar registros no servidor.
Exemplo: DELETE /users/1
O Response é a resposta do servidor ao cliente. Ela é formada por blocos de informação que são enviados pelo servidor ao cliente. Esses blocos são:
-
Headers: São informações adicionais que podem ser enviadas na resposta. Exemplo: Content-Type, Authorization, Accept, etc.
-
Content-Type: É o tipo de conteúdo que está sendo retornado na resposta. Exemplo: text/plain, application/json, text/html, etc.
-
Status Code: É o código de status da resposta. Ele indica o que aconteceu com a requisição. Exemplo: 200, 201, 400, 404, 500, etc.
-
Body: É o corpo da mensagem e contém os dados que foram solicitados pelo cliente. O body é utilizado apenas nos métodos POST e PUT, geralmente, em formato JSON.
Os códigos de status são utilizados para indicar o que aconteceu com a requisição. Os códigos de status são divididos em categoria, sendo esta indicada pelo primeiro dígito do código. As principais categorias são:
-
1xx (de 100 a 199): Indica que a requisição foi recebida e o processo continua em andamento.
-
2xx (de 200 a 299): Indica que a requisição foi recebida, compreendida e aceita.
-
3xx (de 300 a 399): Indica que a requisição foi recebida, compreendida e que o cliente precisa realizar uma ação para completar a requisição. Ou seja, o cliente precisa realizar um redirecionamento.
-
4xx (de 400 a 499): Indica que houve um erro na requisição. Ou seja, o cliente realizou uma requisição inválida.
-
5xx (de 500 a 599): Indica que houve um erro no servidor. Ou seja, o servidor não conseguiu processar a requisição.
Os principais códigos de status são:
-
200: Indica que a requisição foi bem sucedida "OK".
-
201: Indica que a requisição foi bem sucedida e um novo recurso foi criado "Created".
-
204: Indica que a requisição foi bem sucedida, mas não há conteúdo para retornar "No Content".
-
400: Indica que a requisição foi mal sucedida devido a um erro do cliente "Bad Request".
-
401: Indica que a requisição foi mal sucedida devido a falta de autenticação do cliente "Unauthorized".
-
403: Indica que a requisição foi mal sucedida devido a falta de permissão do cliente "Forbidden".
-
404: Indica que a requisição foi mal sucedida devido a um erro do cliente "Not Found".
-
500: Indica que a requisição foi mal sucedida devido a um erro do servidor "Internal Server Error".
REST é a sigla para Representational State Transfer, ou seja, Transferência de Estado Representacional. Ele é um conjunto de princípios que definem como deve ser a arquitetura de um sistema. Sendo assim, é um padrão para construção de API que utiliza o protocolo HTTP e retorna uma representação do estado.
A representação do estado é a forma como os dados são retornados para o cliente. Os formatos mais comuns são: JSON, XML, HTML, etc.
O React Native não lê HTML, por isso, faz-se o retorno da representação dos dados dentro de um JSON.
São funções que são incluídas na aplicação e que podem ser reutilizadas em qualquer lugar. Eles são utilizados para organizar o código e evitar a repetição de código.
Para incluir um módulo, utiliza-se a palavra reservada require e passa-se o nome do módulo como parâmetro. Exemplo:
const http = require('http');
Para exportar um módulo, utiliza-se a palavra reservada module.exports e passa-se o nome do módulo como parâmetro. Exemplo:
module.exports = http;
O NodeJS pode ser utilizado como servidor. Para isso, utiliza-se o módulo http e a função createServer.
A função createServer tem como parâmetro uma função que recebe dois parâmetros: req e res. O req é a requisição do cliente e o res é a resposta do servidor.
Se a resposta de um HTTP deve ser mostrado como HTML, deve-se incluir o header Content-Type com o valor text/html para que o navegador entenda que o conteúdo é HTML e renderize o conteúdo através do método writeHead. Nesse método, é recebido dois parâmetros: o primeiro é o código de status e o segundo é o header.
Depois, para finalizar a resposta, utiliza-se o método end e passa-se o conteúdo que deve ser retornado.
No entanto, o servidor não está rodando. Para isso, utiliza-se o método listen e passa-se a porta que o servidor deve rodar.
Exemplo:
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
});
server.listen(3000, () => {
console.log('Servidor rodando na porta 3000');
});
Os query params são parâmetros que são passados na URL. Eles são utilizados para filtrar os dados. Exemplo:
http://localhost:3000/?nome=Gabriel
A WHATWG URL API é uma API que permite manipular URLs. Ela é utilizada para manipular os query params.
Cria-se uma nova instância da classe URL e passa-se a URL como parâmetro. Exemplo:
const { URL } = require('url');
const parsedUrl = new URL(`http://localhost:3000${request.url}`)
Para pegar os query params, utiliza-se o método searchParams porém é necessário o uso do Object.fromEntries para transformar o objeto de query string em um objeto javascript e assim poder manipular os dados. Exemplo:
request.query = Object.fromEntries(parsedUrl.searchParams);
Para receber parâmetros na URL como, por exemplo, buscar usuário por id na URL, você deve:
-
adicionar em
routes.js
o nome do parâmetro que será passado na URL, por exemplo,'/users/:id'
; -
adicionar em
UserController.js
o método que será chamado na rota, por exemplo,getUserById
; -
criar variáveis em
index.js
para pegar o caminho da URL e o id do usuário, por exemplo,let id = null;
-
Assim, depois, criar uma nova constante para dividir a URL em partes, por exemplo:
const splitEndpoint = pathname.split('/').filter(Boolean);
- A partir disso, criar condicionais para verificar se o tamanho do array é maior que 1, se for, o caminho da URL é o primeiro elemento do array e o id é o segundo elemento do array. Exemplo:
if(splitEndpoint.length > 1) {
// se o tamanho do array for maior que 1, o caminho da url é o primeiro elemento do array
pathname = `/${splitEndpoint[0]}/:id`;
id = splitEndpoint[1];
}
Dessa forma, quando o usuário acessar a rota /users/1
, o caminho da URL será /users/:id
e o id será 1.
Deve-se, ainda, passar request.params = { id };
para que o id seja passado para o request.