Метод fetch() позволяет нам делать запросы, схожие с XMLHttpRequest (XHR). Основное отличие заключается в том, что Fetch API использует Promises (Обещания), которые позволяют использовать более простое и чистое API, избегать катастрофического количества callback’ов и необходимости помнить API для XMLHttpRequest.
Он не поддерживается старыми (можно использовать полифил), но поддерживается всеми современными браузерами.
Базовый синтаксис:
let promise = fetch(url, [options])`
url
– URL для отправки запроса.options
– дополнительные параметры: метод, заголовки и так далее Безoptions
это простой GET -запрос, скачивающий содержимое по адресуurl
.
Процесс получения ответа обычно происходит в два этапа.
- promise выполняется с объектом встроенного класса Response в качестве результата, как только сервер пришлёт заголовки ответа.
На этом этапе мы можем проверить статус HTTP-запрос и определить, выполнился ли он успешно, а также посмотреть заголовки, но пока без тела ответа.
Промис завершается с ошибкой, если
fetch
не смог выполнить HTTP-запрос, например при ошибке сети или если нет такого сайта. HTTP-статусы 404 и 500 не являются ошибкой. Мы можем увидеть HTTP-статус в свойствах ответа: -status
– код статуса HTTP-запроса, например 200. -ok
– логическое значение: будетtrue
, если код HTTP-статуса в диапазоне 200-299.
Например:
let response = await fetch(url);
if (response.ok) {
// если HTTP-статус в диапазоне 200-299
// получаем тело ответа (см. про этот метод ниже)
let json = await response.json();
} else {
alert("Ошибка HTTP: " + response.status);
}`
- Для получения тела ответа нам нужно использовать дополнительный вызов метода
Response предоставляет несколько методов, основанных на промисах, для доступа к телу ответа в различных форматах: -
response.text()
– читает ответ и возвращает как обычный текст, -response.json()
– декодирует ответ в формате JSON, -response.formData()
– возвращает ответ как объектFormData
(разберём его в следующей главе), -response.blob()
– возвращает объект как Blob (бинарные данные с типом), -response.arrayBuffer()
– возвращает ответ как ArrayBuffer (низкоуровневое представление бинарных данных), - помимо этого,response.body
– это объект ReadableStream, с помощью которого можно считывать тело запроса по частям. Мы рассмотрим и такой пример несколько позже.
Типичный запрос с помощью fetch
состоит из двух операторов await
:
let response = await fetch(url, options) // завершается с заголовками ответа
let result = await response.json() // читать тело ответа в формате JSON`
Или, без await
:
fetch(url, options)
.then(response => response.json())
.then(result => /* обрабатываем результат */)`