|
| 1 | + |
| 2 | +# Метод fetch: замена XMLHttpRequest |
| 3 | + |
| 4 | +Метод [fetch](https://fetch.spec.whatwg.org/) -- это `XMLHttpRequest` нового поколения. Он предоставляет улучшенный интерфейс для осуществления запросов к серверу: как по части возможностей и контроля над происходящим, так и по синтаксису, так как построен на [промисах](/promise). |
| 5 | + |
| 6 | +Поддержка в браузерах пока не очень распространена, но есть [полифилл](https://github.com/github/fetch) и не один. |
| 7 | + |
| 8 | +## Синтаксис |
| 9 | + |
| 10 | +Синтаксис метода `fetch`: |
| 11 | +```js |
| 12 | +let promise = fetch(url[, options]); |
| 13 | +``` |
| 14 | + |
| 15 | +<ul> |
| 16 | +<li>`url` -- URL, на который сделать запрос,</li> |
| 17 | +<li>`options` -- необязательный объект с настройками запроса.</li> |
| 18 | +</ul> |
| 19 | + |
| 20 | +Свойства `options`: |
| 21 | +<ul> |
| 22 | +<li>`method` -- метод запроса,</li> |
| 23 | +<li>`headers` -- заголовки запроса (объект),</li> |
| 24 | +<li>`body` -- тело запроса: `FormData`, `Blob`, строка и т.п.</li> |
| 25 | +<li>`mode` -- одно из: "same-origin", "no-cors", "cors", указывает режим в каком режиме кросс-доменности предполагается делать запрос.</li> |
| 26 | +<li>`credentials` -- одно из: "omit", "same-origin", "include", указывает, пересылать ли куки и заголовки авторизации вместе с запросом.</li> |
| 27 | +<li>`cache` -- одно из "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached", указывает, как кешировать запрос.</li> |
| 28 | +<li>`redirect` -- можно поставить "follow" для обычного поведения при коде 30x (следовать редиректу) или "error" для интерпретации редиректа как ошибки.</li> |
| 29 | +</ul> |
| 30 | + |
| 31 | +Как видно, всевозможных настроек здесь больше, чем в `XMLHttpRequest`. Вместе с тем, надо понимать, что если мы используем полифилл, то ничего более гибкого, чем оригинальный `XMLHttpRequest` мы из этого не получим. |
| 32 | + |
| 33 | +Разве что, `fetch`, возможно, будет удобнее пользоваться. |
| 34 | + |
| 35 | +## Использование |
| 36 | + |
| 37 | +При вызове `fetch` возвращает промис, который, когда получен ответ, выполняет коллбэки с объектом [Response](https://fetch.spec.whatwg.org/#response) или с ошибкой, если запрос не удался. |
| 38 | + |
| 39 | +Пример использования: |
| 40 | + |
| 41 | +```js |
| 42 | +//+ run |
| 43 | +'use strict'; |
| 44 | + |
| 45 | +fetch('/article/fetch/user.json') |
| 46 | + .then(function(response) { |
| 47 | + alert(response.headers.get('Content-Type')); // application/json; charset=utf-8 |
| 48 | + alert(response.status); // 200 |
| 49 | + |
| 50 | + return response.json(); |
| 51 | + }) |
| 52 | + .then(function(user) { |
| 53 | + alert(user.name); // iliakan |
| 54 | + }) |
| 55 | + .catch( alert ); |
| 56 | +``` |
| 57 | + |
| 58 | +Объект `response` кроме доступа к заголовкам `headers`, статусу `status` и некоторым другим полям ответа, даёт возможность прочитать его тело, в желаемом формате. |
| 59 | + |
| 60 | +Варианты описаны в спецификации [Body](https://fetch.spec.whatwg.org/#body), они включают в себя: |
| 61 | + |
| 62 | +<ul> |
| 63 | +<li>`response.arrayBuffer()`</li> |
| 64 | +<li>`response.blob()`</li> |
| 65 | +<li>`response.formData()`</li> |
| 66 | +<li>`response.json()`</li> |
| 67 | +<li>`response.text()`</li> |
| 68 | +</ul> |
| 69 | + |
| 70 | +Соответствующий вызов возвращает промис, который, когда ответ будет получен, вызовет коллбэк с результатом. |
| 71 | + |
| 72 | +В примере выше мы можем в первом `.then` проанализировать ответ и, если он нас устроит -- вернуть промис с нужным форматом. Следующий `.then` уже будет содержать полный ответ сервера. |
| 73 | + |
| 74 | +Больше примеров вы можете найти в описании [полифилла для fetch](https://github.com/github/fetch). |
| 75 | + |
| 76 | +## Итого |
| 77 | + |
| 78 | +Метод `fetch` -- уже сейчас удобная альтернатива `XMLHttpRequest` для тех, кто не хочет ждать и любит промисы. |
| 79 | + |
| 80 | +Детальное описание этого метода есть в стандарте [Fetch](https://fetch.spec.whatwg.org/), а простейшие примеры запросов -- в описании к [полифиллу](https://github.com/github/fetch). |
0 commit comments