Метод fetch() объекта Window
Базовая поддержка Широко доступно *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с марта 2017 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Метод fetch() интерфейса Window запускает процесс получения ресурса из сети, возвращая промис, который выполняется после получения ответа.
Промис разрешается объектом Response, представляющим ответ на ваш запрос.
Промис fetch() отклоняется только в случае ошибки запроса, например, из-за неправильно сформированного URL запроса или ошибки сети. Промис fetch() не отклоняется, если сервер отвечает кодами HTTP-статуса, указывающими на ошибки (404, 504, и т. д.). Вместо этого обработчик then() должен проверить свойства Response.ok и/или Response.status.
Метод fetch() контролируется директивой connect-src политики безопасности контента Content Security Policy, а не директивами ресурсов, которые он получает.
Примечание: Параметры метода fetch() идентичны параметрам конструктора Request().
Синтаксис
fetch(resource) fetch(resource, options)
Параметры
resource-
Определяет ресурс, который требуется получить. Это может быть:
- Строка или любой другой объект со строковым преобразованием — включая объект
URL— который предоставляет URL ресурса, который необходимо получить. URL может быть относительным к базовому URL, который являетсяbaseURIв контексте окна илиWorkerGlobalScope.locationв контексте работника. - Объект
Request.
- Строка или любой другой объект со строковым преобразованием — включая объект
optionsНеобязательно-
Объект
RequestInitсодержащий любые пользовательские настройки, которые нужно применить к запросу.
Возвращаемое значение
Исключения
-
AbortErrorDOMException -
Запрос был прерван из-за вызова метода
AbortControllerabort(). -
NotAllowedErrorDOMException -
Выбрасывается, если использование API тем (Topics API) запрещено политикой
browsing-topicsполитики разрешений (Permissions Policy), и был сделан запросfetch()с параметромbrowsingTopics: true. TypeError-
Может возникнуть по следующим причинам:
| Причина | Примеры ошибок |
|---|---|
| Заблокировано политикой разрешений | Использование API отслеживания атрибуции (Attribution Reporting API) заблокировано политикой attribution-reporting политики разрешений (Permissions-Policy), и был сделан запрос fetch() с параметром attributionReporting. |
| Неверное имя заголовка. | // space in "C ontent-Type"
const headers = {
'C ontent-Type': 'text/xml',
'Breaking-Bad': '<3',
};
fetch('https://example.com/', { headers });
|
| Неверное значение заголовка. Объект заголовка должен содержать ровно два элемента. | const headers = [
['Content-Type', 'text/html', 'extra'],
['Accept'],
];
fetch('https://example.com/', { headers });
|
| Неверный URL или схема, или использование схемы, которую fetch не поддерживает, или использование схемы, которая не поддерживается для определенного режима запроса. | fetch('blob://example.com/', { mode: 'cors' });
|
| URL содержит учетные данные. | fetch('https://user:password@example.com/');
|
| Неверный URL referer. | fetch('https://example.com/', { referrer: './abc\u0000df' });
|
Неверные режимы (navigate и websocket). | fetch('https://example.com/', { mode: 'navigate' });
|
| Если режим кеширования запроса — "только-из-кеша", а режим запроса — не "с-тем-же-происхождением". | fetch('https://example.com/', {
cache: 'only-if-cached',
mode: 'no-cors',
});
|
Если метод запроса — неверное имя токена или один из запрещенных заголовков ('CONNECT', 'TRACE' или 'TRACK'). | fetch('https://example.com/', { method: 'CONNECT' });
|
Если режим запроса — "no-cors", а метод запроса — не безопасный метод CORS ('GET', 'HEAD', или 'POST'). | fetch('https://example.com/', {
method: 'CONNECT',
mode: 'no-cors',
});
|
Если метод запроса — 'GET' или 'HEAD' и тело — не null или не undefined. | fetch('https://example.com/', {
method: 'GET',
body: new FormData(),
});
|
| Если fetch генерирует ошибку сети. |
Примеры
В нашем примере с запросом Fetch (см. живой пример запроса Fetch) мы создаём новый объект Request с помощью соответствующего конструктора, а затем получаем его с помощью вызова fetch(). Поскольку мы получаем изображение, мы применяем метод Response.blob() к ответу, чтобы установить правильный тип MIME, а затем создаём URL объекта и отображаем его в элементе <img>.
const myImage = document.querySelector("img");
const myRequest = new Request("flowers.jpg");
window
.fetch(myRequest)
.then((response) => {
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
return response.blob();
})
.then((response) => {
myImage.src = URL.createObjectURL(response);
});
В нашем примере запроса Fetch с параметрами (см. живой пример запроса Fetch с параметрами) мы делаем то же самое, но передаём объект options при вызове fetch(). В этом случае мы можем установить значение Cache-Control, чтобы указать, какие кэшированные ответы нам подходят:
const myImage = document.querySelector("img");
const reqHeaders = new Headers();
// A cached response is okay unless it's more than a week old
reqHeaders.set("Cache-Control", "max-age=604800");
const options = {
headers: reqHeaders,
};
// Pass init as an "options" object with our headers.
const req = new Request("flowers.jpg", options);
fetch(req).then((response) => {
// ...
});
Также можно передать объект init вместе с конструктором Request для достижения того же эффекта:
const req = new Request("flowers.jpg", options);
Также можно использовать объект-литерал как headers в вызове init:
const options = {
headers: {
"Cache-Control": "max-age=60480",
},
};
const req = new Request("flowers.jpg", options);
Спецификации
| Спецификация |
|---|
| Fetch # fetch-method |
Совместимость браузеров
| Рабочий стол | Мобильный телефон | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari в IOS | Samsung Internet | WebView Android | |
fetch |
42 | 14 | 39 | 29 | 10.1 | 42 | 39 | 29 | 10.3 | 4.0 | 42 |
authorization_removed_cross_origin |
Нет | Нет | 111 | Нет | 16.1 | Нет | 111 | Нет | 16.1 | Нет | Нет |
blob_data_support |
48 | 79 | 39 | 35 | 10.1 | 48 | 39 | 35 | 10.3 | 5.0 | 43 |
body_readablestream |
105 | 105 | Нет | 91 | Нет | 105 | Нет | 72 | Нет | 20.0 | 105 |
init_attributionReporting_parameter |
125 | 125 | Нет | 111 | Нет | 125 | Нет | 83 | Нет | 27.0 | 125 |
init_browsingTopics_parameter |
115 | 115 | Нет | 101 | Нет | 115 | Нет | 77 | Нет | 23.0 | 115 |
init_duplex_parameter |
105 | 105 | Нет | 91 | Нет | Нет | Нет | Нет | Нет | Нет | Нет |
init_keepalive_parameter |
66 | 15 | 133 | 53 | 13 | 66 | 133 | 47 | 13 | 9.0 | 66 |
init_priority_parameter |
101 | 101 | Нет | 87 | 17.2 | 101 | Нет | 70 | 17.2 | 19.0 | 101 |
init_referrerPolicy_parameter |
52 | 79 | 52 | 39 | 11.1 | 52 | 52 | 41 | Нет | 6.0 | 52 |
init_signal_parameter |
66 | 16 | 57 | 53 | 11.1 | 66 | 57 | 47 | 11.3 | 9.0 | 66 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/Window/fetch