Fetch API — стандартный веб-интерфейс для выполнения HTTP-запросов, встроенный в современные браузеры. В контексте Vue-приложений он используется для получения данных с серверов, отправки форм, взаимодействия с REST API и микросервисами. В отличие от сторонних библиотек, Fetch не требует установки зависимостей и полностью основан на промисах.
Fetch вызывается через глобальную функцию fetch,
принимающую URL и объект настроек:
fetch('https://api.example.com/users')
.then(response => response.json())
.then(data => {
console.log(data)
})
.catch(error => {
console.error(error)
})
Ключевые особенности:
fetch не отклоняет промис при
HTTP-ошибках (404, 500)
для обработки тела ответа используются методы:
response.json()response.text()response.blob()сетевые ошибки и CORS-ошибки приводят к
catch
Во Vue Fetch обычно вызывается в методах или в жизненных циклах компонента.
export default {
data() {
return {
users: [],
loading: false,
error: null
}
},
mounted() {
this.loadUsers()
},
methods: {
async loadUsers() {
this.loading = true
this.error = null
try {
const response = await fetch('https://api.example.com/users')
if (!response.ok) {
throw new Error(`Ошибка ${response.status}`)
}
this.users = await response.json()
} catch (e) {
this.error = e.message
} finally {
this.loading = false
}
}
}
}
Здесь используется async/await, что делает код линейным
и более читаемым.
В Composition API Fetch чаще всего используется внутри
setup или вынесен в отдельные composable-функции.
import { ref, onMounted } from 'vue'
export default {
setup() {
const users = ref([])
const loading = ref(false)
const error = ref(null)
const loadUsers = async () => {
loading.value = true
try {
const res = await fetch('https://api.example.com/users')
if (!res.ok) throw new Error('Ошибка загрузки')
users.value = await res.json()
} catch (e) {
error.value = e.message
} finally {
loading.value = false
}
}
onMounted(loadUsers)
return { users, loading, error }
}
}
Fetch поддерживает любые HTTP-методы через параметр
method.
fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Ivan',
email: 'ivan@example.com'
})
})
Основные параметры конфигурации:
method — HTTP-методheaders — заголовки запросаbody — тело запроса (строка, FormData, Blob)Для отправки файлов и сложных форм используется
FormData.
const formData = new FormData()
formData.append('avatar', file)
formData.append('name', 'Ivan')
fetch('/upload', {
method: 'POST',
body: formData
})
При использовании FormData заголовок
Content-Type не указывается вручную —
браузер установит его автоматически.
Fetch считает ошибкой только проблемы сети. Проверка статуса выполняется вручную:
if (!response.ok) {
throw new Error(`HTTP ${response.status}`)
}
Часто используется вспомогательная функция:
async function fetchJson(url, options = {}) {
const res = await fetch(url, options)
if (!res.ok) {
const message = await res.text()
throw new Error(message)
}
return res.json()
}
Для поддержки масштабируемости Fetch-запросы выносятся в отдельные модули.
// api/users.js
export async function getUsers() {
const res = await fetch('/api/users')
if (!res.ok) throw new Error('Ошибка')
return res.json()
}
Использование в компоненте:
import { getUsers } from '@/api/users'
const users = await getUsers()
Преимущества подхода:
Для передачи токенов используется заголовок
Authorization.
fetch('/api/profile', {
headers: {
Authorization: `Bearer ${token}`
}
})
При использовании JWT токен обычно хранится:
localStoragesessionStorageFetch подчиняется политике CORS браузера. Основные режимы:
fetch(url, {
mode: 'cors' // по умолчанию
// mode: 'no-cors'
})
Ограничения:
no-cors не позволяет читать тело ответаДля отмены запросов (например, при смене маршрута) используется
AbortController.
const controller = new AbortController()
fetch(url, {
signal: controller.signal
})
controller.abort()
Во Vue это применяется при:
Fetch часто комбинируется с watch или
watchEffect.
watch(searchQuery, async (value) => {
const res = await fetch(`/api/search?q=${value}`)
results.value = await res.json()
})
Это позволяет автоматически выполнять запросы при изменении состояния.
По этим причинам в крупных проектах Fetch часто оборачивается в собственные абстракции или заменяется библиотеками, но знание Fetch остаётся фундаментальным, так как он лежит в основе большинства HTTP-решений в JavaScript.
Fetch при этом остаётся низкоуровневым инструментом, отвечающим исключительно за сетевое взаимодействие, без привязки к UI или состоянию.