Fetch API
Fetch API
— интерфейс для работы с HTTP-запросами и ответами, предоставляет возможность взаимодействия с веб-сервисами, ресурсами сети непосредственно из узла JavaScript
.
Интерфейс Fetch API
включает в себя следующие объекты:
- Headers — заголовки запроса/ответа;
- Request — запрос ресурса сети;
- Response — ответ на запрос;
- fetch() — функция, используемая для получения ресурсов сети.
Перед использованием вышеуказанные объекты должны быть импортированы из встроенного модуля builtIn/Fetch
:
import {fetch, Request, Response, Headers} from "builtIn/Fetch";
Примечание: у объектов
Request
иResponse
отсутствует часть методов и свойств, стандартных для браузеров. Полный перечень см. в Полное описание API, а также в описании ниже.
Описание объектов
Headers
Представляет итерируемую коллекцию HTTP-заголовков. Методы объекта позволяют получать, устанавливать, добавлять и удалять заголовки из коллекции заголовков запроса.
Конструктор
let headers = new Headers([init]);
где:
init
принимает объект типаHeadersInit
(см. Полное описание API). Необязательный параметр.
Создает объект Headers
(см. Полное описание API).
Методы Headers
append(name, value)
- name — имя добавляемого заголовка. Принимает значение типа
string
. Обязательный параметр. - value — значение заголовка. Принимает значение типа
string
. Обязательный параметр.
Добавляет новое значение к существующему заголовку внутри Headers-объекта или добавляет заголовок, если он еще не существует. Метод возвращает undefined
.
delete(name)
- name — имя удаляемого заголовка. Принимает значение типа
string
. Обязательный параметр.
Удаляет заголовок из текущего Headers-объекта. Метод возвращает undefined
.
entries()
Метод возвращает итерируемую коллекцию пар имя/значение заголовков, содержащихся в Headers-объекте. Имя и значение являются строками.
forEach(callbackfn(value, key, parent)[, thisArg])
- callbackfn — функция, применяемая к каждому заголовку. Обязательный параметр. В
callbackfn
в указанном порядке передаются параметры:- value — значение заголовка. Принимает значение типа
string
. - key — имя заголовка. Принимает значение типа
string
. - parent — Headers-объект.
- value — значение заголовка. Принимает значение типа
- thisArg — значение, используемое как
this
при вызовеcallbackfn
. Необязательный параметр.
Метод перебирает коллекцию заголовков в Headers-объекте и выполняет предоставленную функцию для каждого заголовка.
get(name)
- name — имя заголовка. Принимает значение типа
string
. Обязательный параметр.
Возвращает строку, представляющую значение заголовка или null
, если этот заголовок не установлен.
set(name, value)
- name — имя заголовка. Принимает значение типа
string
. Обязательный параметр. - value — значение заголовка. Принимает значение типа
string
. Обязательный параметр.
Устанавливает новое значение для существующего заголовка внутри Headers-объекта или добавляет заголовок, если он еще не существует. Метод возвращает undefined
.
has(name)
- name — имя заголовка. Принимает значение типа
string
. Обязательный параметр.
Возвращает true
или false
в зависимости от того, содержит ли Headers-объект заголовок с указанным именем.
keys()
Возвращает итерируемую коллекцию имен заголовков Headers-объекта.
values()
Возвращает итерируемую коллекцию значений заголовков Headers-объекта.
Request
Представляет собой HTTP-запрос.
Конструктор
let request = new Request(input[, init]);
где:
input
— объект типаRequestInfo
(см. Полное описание API). Обязательный параметр. Принимает URL-адрес запрашиваемого ресурса или объект, реализующий интерфейсRequest
.init
— объект, реализующий интерфейсRequestInit
(см. Полное описание API). Необязательный параметр. Принимает параметры HTTP-запроса .init
-объект может содержать следующие параметры:body
— тело HTTP-запроса. Объект типаBodyInit
(см. Полное описание API).body
может быть строкой или объектом типовArrayBuffer
,ArrayBufferView
.headers
— заголовки HTTP-запроса. headers-объект (см. также Полное описание API).method
— строка, содержащая метод HTTP-запроса (get
,post
и т.д.).redirect
— строка, содержащая режим обработки перенаправлений (follow
,error
,manual
).
Создает объект Request
(см. Полное описание API).
Особенности реализации
Разрешена установка HTTP-заголовков Cookie
и Cookie2
.
Свойства Request
bodyUsed
Содержит логическое значение, указывающее, было ли считано тело запроса (тело запроса может быть считано только один раз). Возвращает true
или false
. Доступно только для чтения.
headers
Содержит HTTP-заголовки запроса (объект Headers
). Доступно только для чтения.
method
Содержит метод запроса (GET, POST и т.д.). Возвращает значение типа string
. Доступно только для чтения.
redirect
Содержит режим обработки перенаправлений. Возвращает одно из значений типа string
:
follow
error
manual
Если свойство не указано при создании запроса, принимает значение по умолчанию follow
. Доступно только для чтения.
url
Содержит URL-адрес запроса. Возвращает значение типа string
. Доступно только для чтения.
Методы Request
arrayBuffer()
Считывает тело запроса и возвращает promise значения типа ArrayBuffer
.
json()
Возвращает promise с объектом, полученным в результате разбора тела запроса как текста в формате JSON.
text()
Возвращает promise со строкой, полученной в результате интерпретации тела запроса как текста в кодировке UTF-8.
clone()
Создает копию текущего Request-объекта.
Response
Представляет собой ответ на HTTP-запрос.
Конструктор
Можно создать новый Response-объект с помощью конструктора, но на практике скорее всего встретится объект, возвращаемый функцией fetch().
let response = new Response([body][, init]);
где:
body
принимает объект типаBodyInit
(см. Полное описание API) илиnull
. Необязательный параметр.init
принимает объект, реализующий интерфейсResponseInit
(см. Полное описание API). Необязательный параметр.
Создает объект Response
(см. Полное описание API).
Особенности реализации
Разрешены заголовки Set-Cookie
и Set-Cookie2
для использования совместно с заголовками Cookie
и Cookie2
запроса.
Свойства Response
bodyUsed
Содержит логическое значение, указывающее, было ли считано тело ответа (тело ответа может быть считано только один раз). Возвращает true
или false
. Доступно только для чтения.
headers
Содержит HTTP-заголовки ответа (объект Headers
). Доступно только для чтения.
ok
Содержит логическое значение, указывающее, был ли ответ успешным (статус в диапазоне 200–299) или нет. Возвращает true
или false
. Доступно только для чтения.
redirected
Содержит логическое значение, указывающее, является ли ответ результатом перенаправленного запроса. Возвращает true
или false
. Доступно только для чтения.
status
Содержит код состояния HTTP-ответа. Возвращает значение типа number
. Доступно только для чтения.
statusText
Содержит сообщение, соответствующее коду состояния HTTP-ответа. Например, OK
соответствует коду состояния 200, Continue
— 100, Not Found
— 404. Возвращает значение типа string
. Доступно только для чтения.
url
Содержит URL-адрес ответа. Значение url
свойства будет конечным URL-адресом, полученным после любых перенаправлений. Возвращает значение типа string
. Доступно только для чтения.
Методы Response
arrayBuffer()
Считывает тело ответа и возвращает promise значения типа ArrayBuffer
.
json()
Возвращает promise с объектом, полученным в результате разбора тела ответа как текста в формате JSON.
text()
Возвращает promise со строкой, полученной в результате интерпретации тела запроса как текста в кодировке UTF-8.
clone()
Создает копию текущего Response-объекта.
fetch()
fetch(resource[, init])
, где
- resource — принимает объект, реализующий интерфейс
Request
, или строку, содержащую URL запроса. Обязательный параметр. - init — принимает объект, реализующий интерфейс
RequestInit
(см. Полное описание API). Необязательный параметр.
Асинхронная функция fetch
запускает процесс извлечения ресурса из сети, возвращая promise объекта Response
(см. Полное описание API).
Примеры
Использование Fetch API
import {fetch, Request, Headers} from "builtIn/Fetch";
// Создание объекта заголовков запроса:
let headers = new Headers({"Content-Type": "text/html", "Custom-Header": "delete me"})
// Вывод значения заголовка
console.log("Custom-Header: ", headers.get("Custom-Header"))
// Удаление заголовка
headers.delete("Custom-Header")
// Проверка существования заголовка
console.log(headers.has('Custom-Header'));
// Добавление нового заголовка
headers.append("Accept-Charset", "utf-8")
// Изменение значения заголовка
headers.set("Content-Type", "application/json")
// Создание объекта запроса:
let request = new Request("http://httpbin.org/post", {
method: "post",
headers: headers,
body: "{ \"str\": message }",
redirect: "follow"
});
// Вывод параметров запроса:
console.log("url: " + request.url);
console.log("bodyUsed: " + request.bodyUsed);
console.log("redirect: " + request.redirect);
console.log("method: " + request.method);
for (let header of headers.entries()) {
console.log(header[0]+ ': '+ header[1]);
}
// Вызов сервиса httpbin.org и вывод параметров ответа:
fetch(request)
.then(response => {
console.log("ok: " + response.ok);
console.log("status: " + response.status);
console.log("statusText: " + response.statusText);
console.log("redirected: " + response.redirected);
console.log("url: " + response.url);
headers.forEach(function(value, key) {
console.log("Name : ", key, " Value : ", value)
});
response.text().then(text => console.log(text));
}).catch(e => console.log(e));
Получение курсов валют ЦБ РФ
import {fetch} from "builtIn/Fetch";
// Запрос сервиса ЦБ:
fetch("https://www.cbr-xml-daily.ru/daily_json.js")
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status},
statusText: ${response.statusText}`);
}
return response.json();
})
.then(json => console.log(JSON.stringify(json)))
.catch(e => console.log(e));
Последовательное выполнение запросов
import {fetch, Headers} from "builtIn/Fetch";
(async() => {
try {
// Запрос 1-ого сервиса
let response1 = await fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
body: JSON.stringify({
title: "foo",
body: "bar",
userId: 1,
}),
headers: new Headers({"Content-type": "application/json; charset=UTF-8"}),
});
let payload = await response1.arrayBuffer();
// Запрос 2-ого сервиса
let response2 = await fetch('http://httpbin.org/post', {
method: 'POST',
headers: new Headers({"Content-Type": "application/json",
"Accept-Charset": "utf-8"}),
body: payload,
});
console.log(await response2.text())
} catch(e) {
console.log(e);
}
})()