Arquitetura de Software

Conteúdo produzido pelas turmas de Arquitetura de Software - Computação @ UFCG

Documento Arquitetural do Axios

Autores

Este documento foi produzido por Marcus Vinícius de Farias Barbosa.

Descrição Arquitetural – Axios

Este documento descreve a arquitetura do Axios. As descrições e diagramas aqui presentes foram produzidos usando como base o modelo C4.

Descrição Geral

O Axios é um cliente HTTP, que pode ser utilizado tanto no navegador quando em projetos Node.js. Ele é disponibilizado como um pacote npm, e fornece uma API para o envio de requisições que lida com XMLHttpRequest do navegador e com o http do Node.js, desse modo o mesmo código pode ser utilizado no lado cliente e no lado servidor.

De acordo com sua documentação oficial, o Axios conta com as seguintes funcionalidades:

  • Faz requisições com XMLHttpRequest a partir do browser;
  • Faz requisições http a partir do node.js;
  • Tem suporte à API Promise;
  • Intercepta requisições e respostas;
  • Transforma dados de requisições e respostas;
  • Cancela requisições;
  • Faz transformações automáticas para dados JSON;
  • Fornecer proteção no lado cliente contra XSRF.

Além disso, por ser uma biblioteca bastante conhecida e utilizada no meio do desenvolvimento web, existem diversas bibliotecas criadas pela comunidade que interagem com o Axios e adicionam a ele novos recursos, que vão desde interceptores de requisições a cache.

Mais informações podem ser encontradas aqui.

Objetivos

Oferecer uma biblioteca baseada em Promises para envio de requisições HTTP de forma simples e sem que o usuário se preocupe se a requisição será feita a partir do navegador ou de um servidor Node.js.

Contexto

Como o Axios se trata de uma biblioteca, os usuários finais são os desenvolvedores de software, que a importam em seus projetos e assim fazem uso de suas funcionalidades.

Em relação à comunicação com sistemas externos, a principal interação realizada é com o servidor alvo das requisições definido pelo usuário. Esse servidor precisa dispor de uma API HTTP, pois esse é o protocolo de comunicação utilizado pelo Axios em suas requisições.

A comunicação também é feita com plugins de terceiros, que são bibliotecas desenvolvidas para interagirem com os recursos do Axios e adicionam a ele novas funcionalidades como suporte a cookies, manipulação de cache e comunicação com middlewares.

O diagrama de contexto abaixo ilustra quais entidades interagem com o Axios.

Diagrama de Contexto

Containers

Como o Axios não é um sistema de software, ou seja, não é composto por aplicações nem possui armazenamento de dados, mas uma biblioteca, ele é constituído de um único container que possui todos os módulos de código necessários para seu funcionamento e implementação de suas funcionalidades.

A sua API disponibiliza os seguintes recursos:

Envio de requisições

axios(config)
// Exemplo de uma requisição POST para um serviço local
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
// Exemplo de uma requisição GET para um serviço remoto
axios({
  method: 'get',
  url: 'http://bit.ly/2mTM3nY',
  responseType: 'stream'
})
  .then(function (response) {
    response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
  });
axios(url[, config])
// Exemplo de envio de uma requisição GET, utilizando o método me envio padrão
axios('/user/12345');

Criação de instância Axios

axios.create([config])
// Exemplo de criação de uma instância Axios
const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'X-Custom-Header': 'foobar'}
});

Mais detalhes sobre a API podem ser encontrados aqui.

Implantação

A sua implantação também é simples se comparado com sistemas de software, pois, tendo sido instalado no projeto através de algum gerenciador de pacotes (como npm e yarn) ou pelo CDN, é preciso apenas se atentar para os requisitos de ambiente: o navegador e sua versão, e a versão no Node.js. Como essas informações são voláteis e dependem da versão atual do Axios, é recomendado verificá-las na documentação oficial.

O diagrama de implantação abaixo ilustra como é feita a implantação do Axios. Nele é possível notar que a biblioteca pode ser utilizada tanto em aplicações que são executadas por um navegador quanto em aplicações Node.js em um servidor. Além disso, nota-se também que os plugins utilizados estão no mesmo nível que o Axios e são importados e utilizados de modo semelhante a ele.

Diagrama de Implantação

Componentes

O Axios é composto pelos seguintes componentes:

  • Axios: fornece uma instância Axios com todos os métodos necessários configurados.
  • Core: contém a lógica de domínio do Axios. É nesse componente em que são implementados o gerenciador de interceptadores, a manipulação de configurações e envio de requisições.
  • Defaults: define as configurações iniciais para a criação de uma instância Axios, como os aliases para os métodos de requisição e a definição do adapter adequado.
  • Adapters: responsável pelo envio de requisições e resolução de Promises retornadas assim que uma resposta é recebida. Existe um adapter para lidar com http do Node.js e outro para lidar com o XHR do navegador.
  • Helpers: dispõe de implementações genéricas que não são específicas para a lógica de domínio, mas que são utilizadas por toda a aplicação, como gerenciamento de cookies, parsers de cabeçalhos HTTP e polyfills do navegador.

O diagrama de componentes abaixo ilustra os componentes apresentados e sua comunicação.

Diagrama de Componentes

Visão de Informação

Dentre os vários tipos de dados que o Axios manipula, o que foi escolhido para ser apresentado nessa seção foi o dado que representa uma requisição, desde a chamada ao método de envio ao seu dispacho para o destinatário.

Através do seguinte fluxo de processamento de uma requisição é possível notar os estados que ela assume ao logo do processo:

  • O método para envio de uma requisição é chamado, e inicia-se o processo de configuração da requisição;
  • O Axios verifica a existência de cabeçalhos e os manipula, adicionando cabeçalhos necessários;
  • Os dados (cabeçalhos e informações enviadas no corpo) da requisição são transformados para um formato padrão;
  • É validado se esses dados são do tipo string, ArrayBuffer, Buffer ou Stream:
    • Se sim, a requisição continua sendo processada;
    • Se não, seu processo de envio é cancelado;
  • São definidos dados de autenticação básica HTTP na requisição;
  • O endereço (URL) do destinatário da requisição é formatado, bem como o protocolo utilizado;
  • Se foi definido algum proxy, a requisição recebe toda a configuração referente a ele, como porta, caminho e nome;
  • A requisição é então enviada.

O diagrama abaixo ilustra o que foi explanado acima, dando enfoque nos estados assumidos por uma requisição.

Diagrama de Máquina de Estados

Contribuições Concretas

Ainda não foram abertas PRs para o repositório oficial do Axios porque ainda é necessário validar a documentação já produzida e produzir uma versão em inglês.