Skip to content

Camille846/firstapi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 

Repository files navigation

Criação de uma API com NodeJS

Tabela com conteúdos teóricos necessários

Node JS

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

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

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.

Request

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.

Métodos HTTP

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
    

Response

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.

Código de status

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".

Padrão REST

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.

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.

Módulos

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.

incluir módulo

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');

exportar módulo

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;

NodeJS como servidor

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');
});

Query Params

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

WHATWG URL API

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);

Receber parâmetros na URL

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.

Releases

No releases published

Packages

No packages published