Axios — это HTTP-клиент на основе промисов, предназначенный для выполнения запросов к серверу из браузера или среды Node.js. В проектах на Vue.js Axios используется для взаимодействия с REST API, загрузки и отправки данных, обработки авторизации и управления состоянием загрузки и ошибок. Он не входит в стандартную поставку Vue, но фактически стал де-факто стандартом для сетевого слоя во Vue-приложениях.
Ключевые характеристики Axios:
async/awaitУстановка выполняется через менеджер пакетов:
npm install axios
или
yarn add axios
В простейшем варианте Axios импортируется напрямую в компонент:
import axios FROM 'axios'
Однако для масштабируемых приложений предпочтительно централизованное подключение.
Экземпляр Axios позволяет задать общие параметры для всех запросов: базовый URL, заголовки, таймауты.
import axios from 'axios'
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 10000,
headers: {
'Content-Type': 'application/json'
}
})
export default api
Преимущества использования экземпляра:
В Vue 3 Axios часто подключается через
app.config.globalProperties:
import { createApp } from 'vue'
import App from './App.vue'
import api from './api'
const app = createApp(App)
app.config.globalProperties.$axios = api
app.mount('#app')
После этого Axios доступен в компонентах:
this.$axios.get('/users')
Альтернативный и более предпочтительный подход — явный импорт в каждом модуле, что улучшает читаемость и тестируемость.
Пример запроса на получение данных:
api.get('/users')
.then(response => {
console.log(response.data)
})
.catch(error => {
console.error(error)
})
С использованием async/await:
const loadUsers = async () => {
try {
const response = await api.get('/users')
users.value = response.data
} catch (error) {
console.error(error)
}
}
Ответ Axios содержит объект со структурой:
data — тело ответаstatus — HTTP-статусheaders — заголовкиconfig — конфигурация запросаОтправка данных:
api.post('/users', {
name: 'Alex',
email: 'alex@example.com'
})
Обновление данных:
api.put(`/users/${id}`, updatedUser)
Удаление:
api.delete(`/users/${id}`)
Axios автоматически сериализует объект в JSON.
Query-параметры передаются через свойство params:
api.get('/users', {
params: {
page: 2,
LIMIT: 10
}
})
Axios корректно кодирует параметры и добавляет их к URL.
Перехватчики позволяют выполнять логику до отправки запроса и после получения ответа.
api.interceptors.request.use(config => {
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
return config
})
Применяется для:
api.interceptors.response.use(
response => response,
error => {
if (error.response?.status === 401) {
// обработка неавторизованного доступа
}
return Promise.reject(error)
}
)
Используется для централизованной обработки ошибок.
Axios различает несколько типов ошибок:
error.response)error.request)Пример детальной обработки:
try {
await api.get('/profile')
} catch (error) {
if (error.response) {
console.error(error.response.status)
} else if (error.request) {
console.error('Нет ответа от сервера')
} else {
console.error(error.message)
}
}
Axios поддерживает отмену запросов через
AbortController:
const controller = new AbortController()
api.get('/users', {
signal: controller.signal
})
controller.abort()
Полезно при:
Типовой паттерн для загрузки данных:
import { ref, onMounted } from 'vue'
import api from '@/api'
export function useUsers() {
const users = ref([])
const loading = ref(false)
const error = ref(null)
const load = async () => {
loading.value = true
try {
users.value = await api.get('/users').then(r => r.data)
} catch (e) {
error.value = e
} finally {
loading.value = false
}
}
onMounted(load)
return { users, loading, error }
}
Такой подход:
Axios часто используется внутри actions:
actions: {
async fetchUsers({ commit }) {
const users = await api.get('/users').then(r => r.data)
commit('setUsers', users)
}
}
В Pinia:
actions: {
async fetchUsers() {
this.users = await api.get('/users').then(r => r.data)
}
}
Axios не хранит состояние — он лишь источник данных для менеджеров состояния.
Рекомендуемая структура:
src/
├─ api/
│ ├─ index.js
│ ├─ users.js
│ └─ auth.js
Пример модуля:
import api from './index'
export const getUsers = () => api.get('/users')
export const getUser = id => api.get(`/users/${id}`)
Это:
Axios выполняет роль сетевого ядра приложения, обеспечивая надежное, предсказуемое и централизованное взаимодействие с сервером. Его интеграция с Vue не требует специальных адаптеров, но грамотная архитектура API-слоя и использование перехватчиков превращают Axios в мощный инструмент для построения сложных клиентских приложений.