Современный сайт трудно представить без запросов к серверу. Все большее и большее количество страниц не требуют перезагрузки страницы при переходе по ссылкам, а всего лишь получают новые данные и перерисовывают необходимые блоки. Использование XMLHttpRequest уже не «торт», так как большинство современных браузеров поддерживают fetch API.

Давайте посмотрим как он работает.

Для начала вспомним как выглядит код для привычного ajax-запроса:

var requestl
if (window.XMLHttpRequest) {
  request = new XMLHttpRequest();
} else if (window.ActiveXObject) {
  try {
    request = new ActiveXObject('Msxml2.XMLHTTP');
  } catch(e) {
    try {
      request = new ActiveXObject('Microsoft.XMLHTTP');
    } catch(e) {
        // выводим ошибку
    }
  }
}

request.open('GET', '/some/url', true);
request.send(null);

Не очень элегантно, но дейтсвенно и кроссбраузерно.

А теперь fetch:

fetch('/some/url', {
    method: 'get'
}).then(function(response) {
    // обработка результата
}).catch(function(err) {
    // обработка ошибки
});

Этот запрос слишком прост. А что если надо поменять заголовки headers?

var request = new Request('/some/url', {
    headers: new Headers({
        'Content-Type': 'text/plain',
        'X-My-Custom-Header': 'CustomValue'
    })
});

fetch(request).then(function() { /* обработчик результатов */ });

А если необходимо сделать POST запрос с отправкой данных:

fetch('/some/url', {
    method: 'post',
    body: JSON.stringify({
        email: document.getElementById('email').value
        password: document.getElementById('password').value
    })
});

Замечу, что в первом then вы не получите данные в response. Для работы с ответом необходимо вернуть response.json(). Вот пример:

fetch('/some/url')
    .then(function(response) { 
        // конвертируем ответ в json
        return response.json();
    }).then(function(data) {
        // а вот и наши данные
        console.log(data); 
    });

А если не json, то:

response.text();
response.blob();