# 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);
}
);
```