Все данные, которые отправил сервер, доступны в объекте Response через свойство body, которое представляет объект ReadableStream, но гораздо проще воспользоваться одним из методов объекта Response. Интерфейс Response предоставляет следующие методы:
arrayBuffer(): возвращает promise, который получает содержимое ответа в виде объекта ArrayBuffer
blob(): возвращает promise, который получает содержимое ответа в виде объекта Blob
clone(): возвращает копию текущего объекта Response
error(): возвращает новый объект Response, который ассоциирован с возникшей ошибкой сети
formData(): возвращает promise, который получает содержимое ответа в виде объекта FormData
json(): возвращает promise, который получает содержимое ответа в виде объекта JSON
redirect(): возвращает новый объект Response с другим адресом URL
text(): возвращает promise, который получает содержимое ответа в виде строки текста
Для получения ответа в виде текста применяется метод text(). Например, сервер на Node.js отправляет в ответ клиенту некоторый текст:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ if(request.url == "/hello"){ response.end("Fetch на METANIT.COM"); } else{ fs.readFile("index.html", (error, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
В данном случае при обращении по адресу "/hello" сервер будет отправлять в ответ клиенту строку текста "Fetch на METANIT.COM".
На странице index.html с помощью метода text() получим эту строку
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <script> fetch("/hello") .then(response => response.text()) .then(responseText => console.log(responseText)); </script> </body> </html>
Для получения отправленного текста у объекта response вызывается метод response.text(), который возвращает Promise. И чтобы получить собственно текст ответа, подсоединяем второй метод then(), в котором в функции-колбеке получаем текст ответа:
then(responseText => console.log(responseText));
Либо можно использовать async/await
getText(); async function getText() { // получаем объект ответа const response = await fetch("/hello"); // из объекта ответа извлекаем текст ответа const responseText = await response.text(); console.log(responseText); }
Пусть сервер отправляет некоторый json-объект:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ if(request.url == "/user"){ const user = {name: "Tom", age: 37}; response.end(JSON.stringify(user)); } else{ fs.readFile("index.html", (error, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
В данном случае сервер при обращении по адресу "/user" отправляет объект user в виде кода json.
Получим этот объект:
fetch("/user") .then(response => response.json()) .then(user => console.log(user.name, " - ", user.age));
Метод json() возвращает объект Promise, поэтому во втором методе then()
можно получить собственно отправленный объект json и
обратиться к его свойствам:
.then(user => console.log(user.name, "-", user.age));
Тот же пример с применением async/await:
getUser(); async function getUser() { // получаем объект ответа const response = await fetch("/user"); // из объекта ответа извлекаем json const user = await response.json(); console.log(user.name, "-", user.age); }
Аналогичым образом можно получать набор объектов в формате json. Допустим, сервер на node.js отправляет массив объектов:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ if(request.url == "/users.json"){ const users = [ {name: "Tom", age: 37}, {name: "Sam", age: 25}, {name: "Bob", age: 41} ]; response.end(JSON.stringify(users)); } else{ fs.readFile("index.html", (error, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
Получим эти данные на веб-странице:
fetch("/users.json") .then(response => response.json()) .then(users => users.forEach(user=> console.log(user.name, " - ", user.age))); // аналог с async/await getUsers(); async function getUsers() { const response = await fetch("/users.json"); const users = await response.json(); users.forEach(user=> console.log(user.name, " - ", user.age)) }
Пусть в папке сервера определен файл users.json со следующим содержимым:
[ {"name": "Tom", "age": 37}, {"name": "Sam", "age": 25}, {"name": "Bob", "age": 41} ]
В случае с сервером node.js мы могли бы в качестве варианта отправить данный файл следующим образом:
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ if(request.url == "/users.json"){ fs.readFile("users.json", (error, data) => response.end(data)); } else{ fs.readFile("index.html", (error, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
В зависимости от конкретной технологии сервера отправка файлов может отличаться. Здесь же, как и в случае с отправкой файла index.html, считываем данные из файла users.json с
помощью функции fs.readFile()
и отправляем в ответ.
На стороне клиента был бы тот же код, что и в предыдущем случае:
fetch("/users.json") .then(response => response.json()) .then(users => users.forEach(user=> console.log(user.name, " - ", user.age)));
С помощью метода blob() можно загрузить бинарные данные. Рассмотрим на примере изображений. Допустим, на сервере есть файл forest.png
Пусть сервер node.js отправляет данный файл при обращении по адресу "forest.png":
const http = require("http"); const fs = require("fs"); http.createServer(function(request, response){ if(request.url == "/forest.png"){ fs.readFile("forest.png", (error, data) => response.end(data)); } else{ fs.readFile("index.html", (error, data) => response.end(data)); } }).listen(3000, ()=>console.log("Сервер запущен по адресу http://localhost:3000"));
На веб-странице index.html для обращения к серверу определим следующий код:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>METANIT.COM</title> </head> <body> <img /> <script> const img = document.querySelector("img"); fetch("/forest.png") .then(response => response.blob()) .then(data => img.src = URL.createObjectURL(data)); </script> </body> </html>
Для показа изображения на веб-странице определен элемент <img >
Метод blob() возвращает объект Promise, который получает данные ответа в виде объекта Blob. И во
втором методе then()
получаем этот объект:
then(data => img.src = URL.createObjectURL(data));
Здесь нам надо для html-элемента <img >
в качестве источника изображения установить полученный файл. Для этого вызывается функция
URL.createObjectURL(), в которую передается объект Blob. Эта функция создает адрес URL, на который проецируется загруженный файл.
Соответственно после выполнения запроса html-элемент <img >
отобразит загруженное изображение:
Аналогичый пример с применением async/await:
const img = document.querySelector("img"); getImage(); async function getImage() { const response = await fetch("/forest.png"); const imgBlob = await response.blob(); img.src = URL.createObjectURL(imgBlob); }
Подобным образом можно получать и использовать другие типы файлов, например, аудио и видеофайлы.