---
# System prepended metadata

title: Uso de Axios
tags: [best practices, axios]

---

# Uso de Axios

## ¿Que es Axios?

**Axios** es un cliente HTTP simple basado en promesas para el navegador y node.js. Axios proporciona una biblioteca fácil de usar en un paquete pequeño con una interfaz muy extensible.

### Ejemplo de uso

Un ejemplo básico de implemtación es el siguiente.

```javascript
import axios from "axios";

axios.get('/users').then(response => {
    console.log(response.data);
});
```

Pero no es 100% recomendable utilizar asi de directo.

## Recomendaciones o buenas práticas

### Instancias por Artefactos

Si concideramos el siguente ejemplo, tenemos un Frontend (Artefacto A) que consume informacion de un Backend For Frontend (Artefacto B) y es una API Externa (Artefacto C).

```mermaid
sequenceDiagram
participant ARTF_A as Artefacto A
participant ARTF_B as Artefacto B
participant ARTF_C as Artefacto C

ARTF_A ->>+ ARTF_B: [GET] request
ARTF_B -->>- ARTF_A: respose

ARTF_A ->>+ ARTF_C: [POST] request
ARTF_C -->>- ARTF_A: respose
```

Seria muy tentado aplicar el codigo de ejemplo de arriba pero es más recomiendable crear una instancia por cada artefacto a conectar, de esta forma cada instancia puede tener su propia configuración, como por ejemplo:

```javascript
import axios from "axios";

// DECLARATION OF AXIOS INSTANCES
const artefactoBInstance = axios.create({
    headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
    }
})

const artefactoCInstance = axios.create({
    headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json',
        Authorization: 'Bearer 7d1df2c6-be67-4216-a122-2b65ed2ecadc'
    }
})

// IMPLEMENTATION OF SERVICES
artefactoBInstance.get('/users').then(response => {
    console.log(response.data);
});

artefactoCInstance.post('/posts').then(response => {
    console.log(response.data);
});
```

De esta forma es posible crear configuraciones totalmente independientes por cada artefacto o proveedor de información.

### Uso de intercaptores

Continuando con último código de ejemplo presentado, planteo los siguientes casos.


#### Caso 1

Es necesario cargar un `Authorization` dinámico por cada request. No entraremos muy en detalle de como se genera el nuevo `accessToken` pero lo dejaremos en responsabilidad de un metodo asincrono lladado `getNewAccessToken`.


```javascript
artefactoAInstance.interceptors.request.use(
    async (config) => {
        const accessToken = await getNewAccessToken();
        config.headers['Authorization'] = `Bearer ${accessToken}`;
        return config;
    },
    (error) => {
        Promise.reject(error);
    },
);
```

#### Caso 2

Es necesario programar un reintento por cada request fallido.

```javascript
const IS_RETRIED_ATTRIBUTE = '_isRetrid';

artefactoBInstance.interceptors.response.use(
    (response) => {
        return response;
    },
    async (error) => {
        const originalRequest = error.config;
        if(!originalRequest[IS_RETRIED_ATTRIBUTE]) {
            originalRequest[IS_RETRIED_ATTRIBUTE] = true;
            return artefactoBInstance(originalRequest);
        }
        return Promise.reject(error);
    }
);
```
