Fetch API является заменой устаревшего XMLHttpRequest.
Fetch API содержит метод fetch() с одним аргументом, в котором указывается URL.
fetch('https://example.com/data')
.then( // code that handles the response )
.catch( // code that runs if the server returns an error )
Интерфейс Response позволяет обрабатывать ответ и ошибки. Интерфейс содержит несколько свойств.
Метод redirect() позволяет перенаправить запрос на другой адрес.
fetch(url)
.then( response => response.redirect(newURL)); // redirects to another URL
.then( // do something else )
.catch( error => console.log('There was an error: ', error))
Метод text() работает с текстовым потоком.
Метод blob() работает с сырыми данными.
Метод json() работает с данными JSON.
Можно создать собственный объект Response.
const response = new Response( 'Hello!', {
ok: true,
status: 200,
statusText: 'OK',
type: 'cors',
url: '/api'
});
Интерфейс Request позволяет создавать нужные запросы. Содержит свойства.
const request = new Request('https://example.com/data', {
method: 'GET',
mode: 'cors',
redirect: 'follow',
cache: 'no-cache'
});
Создадим страницу для демонстрации Ajax.
<!doctype html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<title>Ajax Example</title>
</head>
<body>
<button id='number'>Number Fact</button>
<button id='chuck'>Chuck Norris Fact</button>
<div id='output'>
Ajax response will appear here
</div>
<script src='main.js'></script>
</body>
</html>
Страница содержит две кнопки и один элемент div для вывода информации. Первая кнопка будет получать обычный текст, второй - JSON.
Первая кнопка будет делать запрос к сайту NumbersAPI.
Вторая кнопка обращается к сайте chucknorris.io.
Создадим файл сценария main.js.
const textButton = document.getElementById('number');
const apiButton = document.getElementById('chuck');
const outputDiv = document.getElementById('output');
const textURL = 'http://numbersapi.com/random';
const apiURL = 'https://api.chucknorris.io/jokes/random';
textButton.addEventListener('click', () => {
fetch(textURL)
.then( response => {
outputDiv.innerHTML = 'Waiting for response...';
if(response.ok) {
return response;
} throw Error(response.statusText);
})
.then( response => response.text() )
.then( text => outputDiv.innerText = text )
.catch( error => console.log('There was an error:', error))
}, false);
apiButton.addEventListener('click', () => {
fetch(apiURL)
.then( response => {
outputDiv.innerHTML = 'Waiting for response...';
if(response.ok) {
return response;
} throw Error(response.statusText);
})
.then( response => response.json() )
.then( data => outputDiv.innerText = data.value )
.catch( error => console.log('There was an error:', error))
}, false);
Код для кнопок практически идентичен, только во втором случае используется метод json(). Возвращаемый объект содержит свойство value, содержащий нужный текст.
В примере при ожидании ответа от сервера мы выводим сообщение Waiting for response.... Многие сайты используют в таких случаях специальные анимированные изображения. Можно выбрать готовые изображения с сайта Ajaxload и ему подобных.
Ajax также можно использовать для отправки информации.