Fetch запросы

Разделы:


Виды запросов

ЗапросОписаниеПример использования
GETпростой запрос одной строкой на получение данных, может содержать переменные в адресеполучаем список товаров,
получаем текстовые данные или скачиваем файл,
получаем данные в виде объекта,
поиск товара (фильтрация)
POSTпростой запрос на отправку данных серверу, может передавать данные разного типасоздаём новую запись,
отправляем сообщение,
создаём профиль,
загружаем файл
PUTзапрос на обновление данных на сервере, данных для обновления может быть несколькообновляем данные о товаре,
изменили статью в блоге,
изменили профиль пользователя
PATCHочень похож на метод PUT, поскольку он также изменяет существующий ресурс,
разница лишь в том, что тело запроса должно содержать только одно конкретное изменение в ресурсе. В то время как в PUT, если не передать какое-то одно из ожидаемых полей, то сервер перезапишет в базе это поле на пустое либо вернёт ошибку.
изменяет одну конкретную вещь,
обновляем цену на товаре,
изменили статус аккаунта,
изменили аватар
DELETEзапрос на удаление данных с сервераудалили пост, запись, товар, профиль, страницу на сайте,
очистили историю переписки

Таблица свойств запросов:

СвойстваPUTPATCHGETPOSTDELETE
Запрос имеет телоДаДаНетДаМожет
Успешный ответ имеет телоНетДаДаДаМожет
Меняет состояние сервераДаДаНетДаДа
ИдемпотентныйДаНетДаНетДа
КэшируемыйНетНетДаМожетНет
Допускается в HTML-формахНетНетДаДаНет

Метод HTTP является идемпотентным, если повторный идентичный запрос, сделанный один или несколько раз подряд, имеет один и тот же эффект, не изменяющий состояние сервера. Другими словами, идемпотентный метод не должен иметь никаких побочных эффектов (side-effects), кроме сбора статистики или подобных операций.


Response объект

Response из Fetch API представляет собой ответ на запрос.

Таблица свойств объекта:

СвойстваОписание
response.headersописывает заголовок ответа
response.okбулевое значение, которое указывает, выполнился ли запрос успешно или нет (то есть находится ли код ответа в диапазоне 200–299)
response.redirectedявляется ли результат запроса перенаправлением
response.statusкод ответа
response.statusTextстрока, соответствующая коду ответа (например, OK для кода 200)
response.typeтип ответа (например, базовый, cors)
response.urlURL-адрес ответа
response.bodyобъект ReadableStream, с помощью которого можно считывать тело запроса по частям

Таблица методов объекта:

МетодыОписание
response.clone()создает клон объекта Response
response.error()возвращает новый объект Response, связанный с сетевой ошибкой
response.redirect()создает новый ответ с другим URL
response.text()читает ответ и возвращает как обычный текст
response.json()декодирует ответ в формате JSON
response.formData()возвращает ответ как объект FormData
response.blob()возвращает объект как Blob (бинарные данные с типом)
response.arrayBuffer()возвращает ответ как ArrayBuffer (низкоуровневое представление бинарных данных)

Объект body

response.body

Свойства интерфейса body:

СвойствоОписание
body.bodyпростой геттер, предоставляющий ReadableStream содержимого тела
body.bodyUsedсохраняет логическое значение, указывающее, использовалось ли тело ответа в ответе

Методы интерфейса body:

МетодыВозвращаетОписание
body.arrayBuffer()промиспринимает поток ответа и читает его до конца, по завершении в resolve возвращает ArrayBuffer
body.blob()промиспринимает поток ответа и читает его до конца, по завершении в resolve возвращает Blob
body.formData()промиспринимает поток ответа и читает его до конца, по завершении в resolve возвращает FormData
body.json()промиспринимает поток ответа и читает его до конца, по завершении в resolve возвращает JSON
body.text()промиспринимает поток ответа и читает его до конца, по завершении в resolve возвращает Text

Опции fetch

 

СвойстваПараметрыОписание
methodGET, POST, PUT, DELETE, PATCH и т.д.типы запросов
headers‘Content-Type’: ‘text/plain;charset=UTF-8’

‘Content-Type’: ‘application/x-www-form-urlencoded’

‘Content-Type’: ‘multipart/form-data’

‘Content-Type’: ‘text/plain’

‘Content-Type’: ‘application/json’
и т.д.
объект с запрашиваемыми заголовками (не все заголовки разрешены)
bodystring, FormData, BufferSource, Blob или UrlSearchParamsданные для отправки (тело запроса)
referrer‘about:client’, URL адрес или пустая строка что бы не чего не отправлятьпосылает заголовок Referer
referrerPolicystrict-origin-when-cross-origin, no-referrer-when-downgrade, no-referrer, origin, same-origin и т.д.установка политики реферера
modecors, same-origin, no-corsзащита от нечаянной отправки запроса на другой источник
credentialssame-origin, omit, includeуказывает, должен ли fetch отправлять куки и авторизационные заголовки HTTP вместе с запросом
cachedefault, no-store, reload, no-cache, force-cache или only-if-cachedHTTP-кеширование
redirectfollow, manual, errorHTTP-редирект
integrityконтрольная сумма, например ‘sha256-abcdef1234567890’позволяет проверить, соответствует ли ответ известной заранее контрольной сумме
keepalivefalse, trueуказывает на то, что запрос может «пережить» страницу, которая его отправила
signalundefined, AbortControllerследим за булевым значением чтобы прервать запрос
windowwindow, nullобъект window

Примеры кода

POST запрос:


// передаём данные в виде Json объекта
(async ()=>{
const response = await fetch(url, {
	method: 'POST', // или 'PUT', 'PATCH'  
	body: JSON.stringify(data),
	headers: {
	'Content-Type': 'application/json'
	}
});

if(response.ok && response.status === 200){
	const json = await response.json();
	console.log('Ответ:', JSON.stringify(json));
}
})();

GET запрос:


// получаем данные от сервера в виде текста
(async ()=>{
  const response = await fetch(url);
  
  if(response.ok && response.status === 200){
	  const data = await response.text();
	  
	  console.log('Ответ:', data);
  }  
})();
  
// то же самое, другой вариант.
(async ()=>{
const response = await fetch(url, {
	method: 'GET', // или DELETE
	headers: {
	'Content-Type': 'text/plain;charset=UTF-8'
	}
});

if(response.ok && response.status === 200){
	const json = await response.json();
	console.log('Ответ:', JSON.stringify(json));
}
})(); 

Использование класса AbortController:


const controller = new AbortController();
const signal = controller.signal;

signal.addEventListener('abort', () => console.log('отмена'));

controller.abort(); // после этого будет вызвано событие abort


// Остановить Fetch запрос:

const controller = new AbortController();
fetch(url, {
  signal: controller.signal
});

controller.abort(); // запрос будет прерван

Дополнительно

Код ответа от сервера:

  • Информационные 100 — 199
  • Успешные 200 — 299
  • Перенаправления 300 — 399
  • Клиентские ошибки 400 — 499
  • Серверные ошибки 500 — 599