В этом руководстве вы узнаете об API Fetch в JavaScript и о том, как использовать его для выполнения асинхронных HTTP-запросов и получения данных с сервера.
Fetch API — это современный интерфейс, позволяющий отправлять HTTP-запросы к серверам из веб-браузеров.
Если вы работали с XMLHttpRequest
( XHR
), метод может выполнять все задачи, как и объект XHR
.
Кроме того, Fetch API намного проще и чище. Он использует Promise
для предоставления более гибких функций для выполнения запросов к серверам из веб-браузеров.
Метод fetch()
доступен в глобальной области, которая указывает веб-браузерам отправлять запрос на URL-адрес.
Отправка запроса
Для fetch()
требуется только один параметр, который является URL-адресом ресурса, который вы хотите получить:
let response = fetch(url);
Метод fetch()
возвращает Promise
, поэтому для его обработки можно использовать then()
и catch()
:
fetch(url) .then(response => { // handle the response }) .catch(error => { // handle the error });
Когда запрос завершится, ресурс будет доступен. В это время обещание преобразуется в объект Response
.
Объект Response
является оболочкой API для извлеченного ресурса. Объект Response
имеет ряд полезных свойств и методов для проверки ответа.
Чтение ответа
Если содержимое ответа представлено в формате необработанного текста, вы можете использовать метод text()
. Метод text()
возвращает Promise
, который разрешается с полным содержимым извлеченного ресурса:
fetch('/readme.txt') .then(response => response.text()) .then(data => console.log(data));
На практике часто используется async
/ await
с методом fetch()
следующим образом:
async function fetchText() { let response = await fetch('/readme.txt'); let data = await response.text(); console.log(data); }
Помимо метода text()
объект Response
имеет другие методы, такие как json()
, blob()
, formData()
и arrayBuffer()
для обработки соответствующего типа данных.
Обработка кодов состояния ответа
Объект Response
предоставляет код состояния и текст состояния через status
и statusText
. Когда запрос выполнен успешно, код состояния — 200
, а текст состояния — OK
:
async function fetchText() { let response = await fetch('/readme.txt'); console.log(response.status); // 200 console.log(response.statusText); // OK if (response.status === 200) { let data = await response.text(); // handle data } } fetchText();
Выход:
200 OK
Если запрошенный ресурс не существует, код ответа — 404
:
let response = await fetch('/non-existence.txt'); console.log(response.status); // 400 console.log(response.statusText); // Not Found
Выход:
400 Not Found
Если запрошенный URL-адрес выдает ошибку сервера, код ответа будет 500
.
Если запрошенный URL-адрес перенаправляется на новый с ответом 300-309
, status
объекта Response
устанавливается на 200
. Кроме того, для redirected
установлено значение true
.
fetch()
возвращает обещание, которое отклоняется, когда происходит реальный сбой, например тайм-аут веб-браузера, потеря сетевого подключения или нарушение CORS.
Пример
Предположим, у вас есть файл json, который находится на веб-сервере со следующим содержимым:
[{ "username": "john", "firstName": "John", "lastName": "Doe", "gender": "Male", "profileURL": "img/male.png", "email": "john.doe@example.com" }, { "username": "jane", "firstName": "Jane", "lastName": "Doe", "gender": "Female", "profileURL": "img/female.png", "email": "jane.doe@example.com" } ]
Ниже показана HTML-страница:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fetch API Demo</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container"></div>
<script src="js/app.js"></script>
</body>
</html>
В app.js
мы будем использовать метод fetch()
для получения пользовательских данных и визуализации данных внутри элемента <div>
с классом container
.
- Во-первых, объявите функцию
getUsers()
, которая получаетusers.json
с сервера.
async function getUsers() { let url = 'users.json'; try { let res = await fetch(url); return await res.json(); } catch (error) { console.log(error); } }
- Затем разработайте функцию
renderUsers()
, которая отображает пользовательские данные:
async function renderUsers() { let users = await getUsers(); let html = ''; users.forEach(user => { let htmlSegment = `<div class="user"> <img src="${user.profileURL}" > <h2>${user.firstName} ${user.lastName}</h2> <div class="email"><a href="email:${user.email}">${user.email}</a></div> </div>`; html += htmlSegment; }); let container = document.querySelector('.container'); container.innerHTML = html; } renderUsers();
Ознакомьтесь с демонстрацией Fetch API.
Заключение
- Fetch API позволяет асинхронно запрашивать ресурс.
- Используйте метод
fetch()
, чтобы вернуть промис, который преобразуется в объектResponse
. Чтобы получить фактические данные, вы вызываете один из методов объекта Response, например,text()
илиjson()
. Эти методы разрешаются в фактические данные. - Используйте
status
иstatusText
объектаResponse
, чтобы получить статус и текст статуса ответа. - Используйте метод
catch()
илиtry...catch
для обработки запроса об ошибке.