
Пример заголовков ответа:
Copy
Download
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 1024
Cache-Control: max-age=3600
Server: nginx/1.18.0
Date: Wed, 21 Oct 2023 14:28:00 GMT
Access-Control-Allow-Origin: *
5. Как выполнить HTTP запрос?
В JavaScript есть несколько способов выполнения HTTP-запросов:
1. XMLHttpRequest (старый способ):
javascript
Copy
Download
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/data', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
if (xhr.status === 200) {
const response = JSON.parse(xhr.responseText);
console.log(response);
} else {
console.error('Ошибка:', xhr.statusText);
}
};
xhr.onerror = function() {
console.error('Ошибка сети');
};
xhr.send();
2. Fetch API (современный способ):
javascript
Copy
Download
fetch('https://api.example.com/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123'
},
body: JSON.stringify({ key: 'value' })
})
.then(response => {
if (!response.ok) {
throw new Error('Ошибка сети');
}
return response.json();
})
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));
3. Axios (популярная библиотека):
javascript
Copy
Download
axios.get('https://api.example.com/data', {
params: { id: 123 },
headers: { 'X-Custom-Header': 'value' }
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
4. jQuery AJAX (если используется jQuery):
javascript
Copy
Download
$.ajax({
url: 'https://api.example.com/data',
type: 'GET',
dataType: 'json',
success: function(data) {
console.log(data);
},
error: function(xhr, status, error) {
console.error(error);
}
});
Основные шаги выполнения запроса:
Создание запроса с указанием метода (GET, POST и т.д.)
Установка необходимых заголовков
Отправка запроса (с телом для POST/PUT)
Обработка ответа (успешного или с ошибкой)
Парсинг данных ответа (если нужно)
6. Что такое XMLHttpRequest и fetch и в чем их отличие?
XMLHttpRequest (XHR):
Год появления: 2006 (Internet Explorer 5)
Тип API: Старый, основанный на событиях
Синтаксис: Более сложный и многословный
Промисы: Не поддерживает, использует колбэки
Отмена запроса: Через метод .abort()
Поддержка CORS: Требует дополнительной настройки
Поддержка старых браузеров: Полная
Fetch API:
Год появления: 2015 (ES6)
Тип API: Современный, основанный на промисах
Синтаксис: Более чистый и понятный
Промисы: Полноценная поддержка
Отмена запроса: Через AbortController
Поддержка CORS: Встроенная, с настройками по умолчанию
Поддержка старых браузеров: Требует полифилов для IE
Ключевые различия:
Характеристика |
XMLHttpRequest |
Fetch |
Возраст |
Старый API |
Современный API |
Интерфейс |
Основан на событиях |
Основан на промисах |
Синтаксис |
Более сложный |
Более простой |
JSON |
Требует ручного парсинга |
Встроенные методы (.json()) |
Обработка ошибок |
Проверка status |
Проверка response.ok |
Отмена запроса |
xhr.abort() |
AbortController |
Загрузка файлов |
Поддерживает |
Поддерживает |
Отправка формы |
FormData |
FormData |
Поддержка браузеров |
Все |
Современные + полифиллы |
Когда использовать что:
Fetch API: Для новых проектов, когда нужен чистый и современный код
XMLHttpRequest: Для поддержки очень старых браузеров или специфических задач (например, отслеживание прогресса загрузки)
7. Что такое CORS?
CORS (Cross-Origin Resource Sharing) - это механизм безопасности браузеров, который разрешает или запрещает запросы к ресурсам на другом домене (origin).
Как работает CORS:
Браузер отправляет запрос на другой домен
Сервер отвечает с соответствующими CORS-заголовками
Браузер проверяет заголовки и решает, разрешить ли доступ к ответу
Основные понятия:
Origin (источник): Комбинация протокола, домена и порта (https://example.com:443)
Простой запрос (Simple request): GET/HEAD/POST с определенными заголовками
Предварительный запрос (Preflight): OPTIONS-запрос перед основным для сложных запросов
Учетные данные (Credentials): Куки, HTTP-аутентификация
CORS-заголовки:
Заголовки запроса:
Origin: Домен, с которого отправляется запрос
Access-Control-Request-Method: Метод для предварительного запроса
Access-Control-Request-Headers: Заголовки для предварительного запроса
Заголовки ответа:
Access-Control-Allow-Origin: Разрешенные домены (* или конкретный)
Access-Control-Allow-Methods: Разрешенные HTTP-методы
Access-Control-Allow-Headers: Разрешенные заголовки запроса
Access-Control-Allow-Credentials: Разрешение отправки учетных данных
Access-Control-Max-Age: Время кэширования предварительного запроса
Пример CORS-политики:
Copy
Download
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Credentials: true
Типичные ошибки CORS:
Отсутствие заголовка Access-Control-Allow-Origin
Попытка отправить учетные данные без Access-Control-Allow-Credentials: true
Использование запрещенных заголовков в запросе
Как решать проблемы с CORS:
Настроить сервер для отправки правильных CORS-заголовков
Использовать прокси-сервер
Для разработки - отключить CORS в браузере (только для тестирования)
Использовать механизм JSONP для GET-запросов (устаревший способ)
Важно: CORS - это защита на стороне браузера. Сервер может обрабатывать запросы от любого источника, но браузер не даст клиентскому JavaScript доступ к ответу без правильных CORS-заголовков