Skip to main content

axios

Библиотека-надстройка над fetch(). Axios — модифицированный и более сложный аналог Fetch API. Кто-то предпочитает метод fetch, кто-то axios. Некоторые заново пишут обёртки над XHR, чтобы не тащить библиотеку. Интересное сравнение fetch и axios. В проекте нельзя будет использовать ни Fetch API, ни axios. Вы сами реализуете в тренажёре аналог fetch используя XMLHttpRequest и будете использовать свою реализацию.

  • Fetch-based js-library.
  • Promise based HTTP client for the browser and node.js

Axios может обходиться без метода json() как в fetch.

Установка:

$ yarn add axios
axios.get('https://swapi.co/api/people/').then(response => console.log(response));

Response Schema

Ответ через axios будет возвращен с определенным уже структурированным форматом данных - это преимущество над fetch

{
// `data` is the response from the server
data: {},

// `status` is the HTTP status code from the server response
status: 200,

// `statusText` is the HTTP status message from the server response
statusText: 'OK',

// `headers` the HTTP headers that the server responded with
// All header names are lowercase and can be accessed using the bracket notation.
// Example: `response.headers['content-type']`
headers: {},

// `config` is the config that was provided to `axios` for the request
config: {},

// `request` is the request that generated this response
request: {}
}

Примеры запросов

axios-get

import axios from 'axios';
import { API_URL, subUrl } from './api/apiUrl';

const getCampaing = id => {
const token = JSON.parse(localStorage.getItem('ph-admin-user-data')).id;

return axios.get(
`${API_URL}/${subUrl}/vacancies/${id}`,
{
headers: { Authorization: token }
}
)
};

export default getCampaing;

axios-delete

import axios from 'axios';
import { API_URL, subUrl } from './api/apiUrl';

const deleteCampaing = id => {
const token = JSON.parse(localStorage.getItem('ph-admin-user-data')).id;

return axios.delete(
`${API_URL}/${subUrl}/vacancies/${id}`,
{
headers: { Authorization: token }
}
)
};

export default deleteCampaing;

axios-post

import axios from 'axios';
import { API_URL, subUrl } from './api/apiUrl';

const login = (name, password) => {
return axios.post(
`${API_URL}/${subUrl}/login`,
{
name,
password,
},
);
}

export default login;

axios-filter

import axios from 'axios';
import { API_URL, subUrl } from './api/apiUrl';

const getCompanies = inputValue => {
const token = JSON.parse(localStorage.getItem('ph-admin-user-data')).id;

return axios.get(
`${API_URL}/${subUrl}/companies`,
{
params: {
filter: {
// поиск по name, surname, email
where: {
or: [
{ name: { like: `%${inputValue}%`} },
{ surname: { like: `%${inputValue}%`} },
{ email: { like: `%${inputValue}%`} }
],
},
limit: 10,
offset: 50,
order: 'id DESC',
}
},
headers: { Authorization: token }
}
);
}

export default getCompanies;

Пример с PH

import axios from 'axios';
import { format } from 'date-fns';

import { API_URL, subUrl } from 'api/apiUrl';

const getJobs = state => {
const token = JSON.parse(localStorage.getItem('ph-admin-user-data')).id;

const { pageSize, page, filtered, sorted } = state; // from own state of react-table

// filter-template
const filter = {
where: {},
limit: pageSize,
skip: page * pageSize,
order: 'id DESC'
};

// inject where to filter
filtered.forEach(i => {
// Id column // +
if (i.id === 'id') {
filter.where[i.id] = i.value;

// Job column // +
} else if (i.id === 'name') {
filter.where[i.id] = { 'like': '%' + i.value + '%' };

// Locations column // +
} else if (i.id === 'locations') {
if (i.value) {
filter.where.locations = { 'inq': i.value.map(i => i.id) };
} else {
filter.where.locations = {};
}

// User column // +
} else if (i.id === 'employer') {
if (i.value) {
filter.where.employer_id = i.value.id;
} else {
filter.where.employer_id = null;
}

// Company column // +
} else if (i.id === 'company') {
console.log(i.value);
if (i.value) {
filter.where.companies = { 'inq': i.value.map(i => i.id) };
} else {
filter.where.companies = {};
}

// Status column // +
} else if (i.id === 'status') {
filter.where[i.id] = i.value;

// Plan column // +
} else if (i.id === 'plan_id') {

if (i.value === 5) {
filter.where[i.id] = { gt: 1 }
} else {
filter.where[i.id] = i.value;
}

// Created // +
} else if (i.id === 'created') {
const createdDate = i.value && format(i.value, 'yyyy-MM-dd');
filter.where.created = { 'gt': createdDate };
filter.order = i.value ? 'created DESC' : 'id DESC';

// Published // +
} else if (i.id === 'published') {
const publisheddDate = i.value && format(i.value, 'yyyy-MM-dd');
filter.where.published = { 'gt': publisheddDate };
// filter.order = i.value ? 'created DESC' : 'published DESC';
}
});


// inject order to filter
sorted.forEach(i => {
const desc = i.desc ? 'DESC' : 'ASC'
filter.order = `${i.id} ${desc}`;
});

// get-request for data
return axios.get(`${API_URL}/${subUrl}/vacancies/searchExtra`, {
params: { filter },
headers: { Authorization: token },
})
};

export default getJobs;

Обработчик ошибок (isAxiosError)

catch (error) {
if (axios.isAxiosError(error)) {
console.log('error message: ', error.message);
return error.message;
} else {
console.log('unexpected error: ', error);
return 'An unexpected error occurred';
}
}

TypeScript

Можно типизировать axios через дженерик-тип после метода.

type GetUsersResponse = {
data: SomeItem[]; // типизируем данные
};

axios.get<GetUsersResponse>('some-url', {
options,
})

Пример асинхронной функции с axios

import axios from 'axios';

type UpdateUserResponse = {
name: string;
job: string;
updatedAt: string;
};

async function updateUser() {
try {
// 👇️ const data: UpdateUserResponse
const { data } = await axios.put<UpdateUserResponse>(
'https://reqres.in/api/users/2',
{ name: 'John Smith', job: 'manager' },
{
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
},
);

console.log(JSON.stringify(data, null, 4));

return data;
} catch (error) {
if (axios.isAxiosError(error)) {
console.log('error message: ', error.message);
// 👇️ error: AxiosError<any, any>
return error.message;
} else {
console.log('unexpected error: ', error);
return 'An unexpected error occurred';
}
}
}