← Назад к вопросам
Как отправить запрос не используя форму?
2.0 Middle🔥 121 комментариев
#Браузер и сетевые технологии
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Отправка HTTP запросов без HTML формы
В современном веб-разработке отправляют запросы на сервер программно через JavaScript, минуя HTML формы. Это дает больший контроль и позволяет создавать асинхронные приложения.
Fetch API (Современный стандарт)
Самый популярный способ в современном JavaScript:
// GET запрос
const response = await fetch('https://api.example.com/users');
const data = await response.json();
console.log(data);
// POST запрос с JSON
const user = { name: 'John', email: 'john@example.com' };
const response = await fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(user)
});
const result = await response.json();
console.log(result);
// PUT запрос (обновление)
const updateData = { name: 'Jane' };
const response = await fetch('https://api.example.com/users/1', {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(updateData)
});
// DELETE запрос
const response = await fetch('https://api.example.com/users/1', {
method: 'DELETE'
});
Обработка ошибок
async function fetchData() {
try {
const response = await fetch('/api/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Ошибка запроса:', error);
throw error;
}
}
Отправка файлов (FormData)
Для отправки файлов используй FormData:
const formData = new FormData();
formData.append('file', fileInput.files[0]);
formData.append('description', 'My file');
const response = await fetch('/api/upload', {
method: 'POST',
body: formData // Не указывай Content-Type, браузер установит автоматически
});
const result = await response.json();
Передача дополнительных заголовков
const response = await fetch('/api/protected', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`,
'X-Custom-Header': 'value',
'Content-Type': 'application/json'
}
});
Отмена запроса (AbortController)
const abortController = new AbortController();
const response = await fetch('/api/data', {
signal: abortController.signal
});
// Отмени запрос в любой момент
abortController.abort();
// В обработчике ошибок
try {
const response = await fetch('/api/data', {
signal: abortController.signal
});
} catch (error) {
if (error.name === 'AbortError') {
console.log('Запрос был отменен');
}
}
XMLHttpRequest (Устаревший API)
Ещё работает, но fetch предпочтительнее:
const xhr = new XMLHttpRequest();
xhr.open('POST', '/api/users');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = () => {
if (xhr.status === 200) {
const data = JSON.parse(xhr.responseText);
console.log(data);
}
};
xhr.onerror = () => {
console.error('Ошибка запроса');
};
xhr.send(JSON.stringify({ name: 'John' }));
axios (Популярная библиотека)
Этот пакет часто используется в React приложениях:
import axios from 'axios';
// GET
const { data } = await axios.get('/api/users');
// POST
const response = await axios.post('/api/users', {
name: 'John',
email: 'john@example.com'
});
// Все методы
await axios.put('/api/users/1', { name: 'Jane' });
await axios.delete('/api/users/1');
await axios.patch('/api/users/1', { role: 'admin' });
// Конфигурация по умолчанию
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
// Перехватчики (interceptors)
axios.interceptors.response.use(
response => response,
error => {
if (error.response?.status === 401) {
// Обработать 401 Unauthorized
window.location.href = '/login';
}
return Promise.reject(error);
}
);
Параметры запроса (Query параметры)
// Fetch с параметрами
const params = new URLSearchParams();
params.append('page', '1');
params.append('limit', '10');
params.append('sort', 'name');
const response = await fetch(`/api/users?${params}`);
const data = await response.json();
// Или вручную
const query = 'page=1&limit=10&sort=name';
const response = await fetch(`/api/users?${query}`);
// axios автоматически кодирует параметры
const { data } = await axios.get('/api/users', {
params: { page: 1, limit: 10, sort: 'name' }
});
Пример: Реактивный поиск
class SearchAPI {
constructor(baseURL) {
this.baseURL = baseURL;
this.abortController = null;
}
async search(query) {
// Отмени предыдущий запрос
if (this.abortController) {
this.abortController.abort();
}
this.abortController = new AbortController();
try {
const response = await fetch(
`${this.baseURL}/search?q=${encodeURIComponent(query)}`,
{ signal: this.abortController.signal }
);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
return await response.json();
} catch (error) {
if (error.name !== 'AbortError') {
console.error('Search error:', error);
}
throw error;
}
}
}
const api = new SearchAPI('https://api.example.com');
const results = await api.search('javascript');
Основные отличия
- Fetch - встроенный, современный API, хороший для простых случаев
- XMLHttpRequest - устаревший, избегай использования
- axios - более удобен с конфигурацией и перехватчиками, требует установки
- Библиотеки: React Query, SWR, TanStack Query - для продвинутого кэширования
Для большинства случаев используй Fetch API с async/await.