You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 5-network/01-fetch/article.md
+38-38Lines changed: 38 additions & 38 deletions
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,9 @@
1
1
2
2
# Fetch
3
3
4
-
JavaScript може відправляти мережові запити на сервер та підвантажувати нову інформацію по мірі необхідності.
4
+
JavaScript може відправляти мережеві запити на сервер та підвантажувати нову інформацію за потребою.
5
5
6
-
Наприклад, можна використовувати мережовий запит, щоб:
6
+
Наприклад, можна використовувати мережевий запит, щоб:
7
7
8
8
- Відправляти замовлення,
9
9
- Завантажити інформацію про користувача,
@@ -12,11 +12,11 @@ JavaScript може відправляти мережові запити на с
12
12
13
13
...І все це без перезавантаження сторінки!
14
14
15
-
Є загальний термін "AJAX" (абревіатура від <b>A</b>synchronous <b>J</b>avaScript <b>A</b>nd <b>X</b>ML) для мережевих запитів від JavaScript. Але не обов’язково використовувати XML: цей термін старий, тому це слово тут. Можливо, ви вже чули цей термін.
15
+
Є загальний термін "AJAX" (абревіатура від <b>A</b>synchronous <b>J</b>avaScript <b>A</b>nd <b>X</b>ML) для мережевих запитів від JavaScript коду. Але формат XML використовувати не обов’язково: цей термін застарілий, тому це слово (XML) тут. Можливо, ви вже його десь чули.
16
16
17
17
Є кілька способів надіслати мережевий запит і отримати інформацію з сервера.
18
18
19
-
Метод `fetch()` - сучасний та дуже потужний, через то буде почато з него. Він не підтримуєся старими (можна використовувати поліфіл), але підтримуєся всіма сучасними браузерами.
19
+
Метод `fetch()` -- сучасний та дуже потужний, тому почнемо з нього. Він не підтримується старими (можна використовувати поліфіл), але підтримується всіма сучасними браузерами.
20
20
21
21
Базовий синтаксис:
22
22
@@ -27,21 +27,21 @@ let promise = fetch(url, [options])
27
27
-**`url`** -- URL для відправлення запиту.
28
28
-**`options`** -- додаткові параметри: метод, заголовки і т.д.
29
29
30
-
Без `options`, це просто GET запит, котрий скачує вміс за адресою `url`.
30
+
Без `options`, це просто GET запит, який завантажує зміст за адресою `url`.
31
31
32
-
Браузер зразу починає запит та повертає проміс, котрий зовнішний код використовує для отримання результатів.
32
+
Браузер одразу починає робити запит та повертає проміс, який зовнішний код використовує для отримання результату.
33
33
34
-
Процес отримання запиту зазвичай відбуваєся у два етапи.
34
+
Процес отримання запиту зазвичай відбувається у два етапи.
35
35
36
-
**Поперше, `promise`виконуєся із об'єктом вбудованого класу [Response](https://fetch.spec.whatwg.org/#response-class) у якості результу, зразу коли сервер надішле заголовки відповіді.**
36
+
**По-перше, `promise`завершиться із об'єктом вбудованого класу [Response](https://fetch.spec.whatwg.org/#response-class) у якості результату, одразу коли сервер надішле заголовки відповіді.**
37
37
38
38
На цьому етапі можна перевірити статус HTTP-запиту, та визначити, чи виконався він успішно, а також переглянути заголовки, але покищо без тіла запиту.
39
39
40
-
Проміс закінчуєся помилкою, якщо `fetch` не зміг виконати HTTP-запит, e.g. наприклад, під час помилки мережі або якщо такий сайт відсутний. HTTP-статуси404 та 500 це не помилка.
40
+
Проміс закінчується помилкою, якщо `fetch` не зміг виконати HTTP-запит, наприклад, через помилку мережі або, якщо такого сайту не існує. Ненормальні HTTP-статуси, як 404 та 500, не викликатимуть помилку.
41
41
42
-
Можна побачити власний HTTP-статус у власних запитах:
42
+
Ми можемо побачити HTTP-статус у властивостях відповіді:
43
43
44
-
-**`status`** -- код статуса HTTP-запиту, наприклад, 200.
44
+
-**`status`** -- код статуса HTTP-запиту, наприклад, 200.
45
45
-**`ok`** -- логічне значення, котре буде `true`, якщо код HTTP-статосу в діапазоні 200-299.
46
46
47
47
Наприклад:
@@ -50,7 +50,7 @@ let promise = fetch(url, [options])
50
50
let response =awaitfetch(url);
51
51
52
52
if (response.ok) { // якщо HTTP-статус у діапазоні 200-299
53
-
// отримання тіла запиту (див. про цей метод нище)
53
+
// отримання тіла запиту (див. про цей метод нижче)
54
54
let json =awaitresponse.json();
55
55
} else {
56
56
alert("HTTP-Error: "+response.status);
@@ -59,16 +59,16 @@ if (response.ok) { // якщо HTTP-статус у діапазоні 200-299
59
59
60
60
**По друге, для отримання тіла запиту, потрібно використовувати додатковий виклик методу.**
61
61
62
-
`Response`представляє декілька методів, котрі грунтуются на промісах, для доступу до тіла запиту в різних форматах:
62
+
`Response` надає декілька методів, які повертають проміс, для доступу до тіла запиту в різних форматах:
63
63
64
64
-**`response.text()`** -- читає відповід та повертає, як звичайний текст,
65
65
-**`response.json()`** -- декодує відповідь у форматі JSON,
66
-
-**`response.formData()`** -- повертає відповідь, як `FormData`object (він буде розглянутий [у наптупному розділі](info:formdata)),
67
-
-**`response.blob()`** -- повертає об'єкт, як[Blob](info:blob) (бінарні дані з типом),
66
+
-**`response.formData()`** -- повертає відповідь, як об'єкт `FormData` (він буде розглянутий [у наступному розділі](info:formdata)),
67
+
-**`response.blob()`** -- повертає відповідь, як[Blob](info:blob) (бінарні дані з типом),
68
68
-**`response.arrayBuffer()`** -- повертає відповідь, як [ArrayBuffer](інформація: буфер масиву - бінарний масиви) (низькорівневе представлення двійкових даних),
69
-
- крім того, `response.body` це об'єкт [ReadableStream](https://streams.spec.whatwg.org/#rs-class) ,за допомогою котрого можна отримувати (зчитувати) тіло частинами. Такий приклад буде розглянуто трохи пізніше.
69
+
- крім того, `response.body` це об'єкт [ReadableStream](https://streams.spec.whatwg.org/#rs-class), за допомогою якого можна отримувати (зчитувати) тіло відповіді частинами. Такий приклад буде розглянуто трохи пізніше.
70
70
71
-
Наприклад, буде отримано JSON-об'єкт з останніми комітами із ропозиторію GitHub:
71
+
Наприклад, буде отримано JSON-об'єкт з останніми комітами із репозиторію GitHub:
72
72
73
73
```js run async
74
74
let url ='https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits';
@@ -99,16 +99,16 @@ let text = await response.text(); // read response body as text
99
99
alert(text.slice(0, 80) +'...');
100
100
```
101
101
102
-
Для прикладу роботи із бінарними даними, буде зроблено запит та виведено на екран логотип [специфікації "fetch"](https://fetch.spec.whatwg.org) (див. розділ [Blob](info:blob), дізнатися про операції із `Blob`):
102
+
Для прикладу роботи із бінарними даними, буде зроблено запит та виведено на екран логотип [специфікації "fetch"](https://fetch.spec.whatwg.org) (див. розділ [Blob](info:blob), щоб дізнатись детальніше про операції із `Blob`):
103
103
104
104
```js async run
105
105
let response =awaitfetch('/article/fetch/logo-fetch.svg');
106
106
107
107
*!*
108
-
let blob =awaitresponse.blob(); //скачано, як Blob об'єкт
108
+
let blob =awaitresponse.blob(); //скачати, як Blob об'єкт
@@ -125,19 +125,19 @@ setTimeout(() => { // приховування через три секунди
125
125
````Важливо
126
126
Можна вибрати тільки один метод читання відповіді.
127
127
128
-
Якщо, було отримано відповід із `response.text()`, тоді `response.json()` не зпрацює, бо дані вже були оброблені..
128
+
Якщо, було отримано відповід із `response.text()`, тоді `response.json()` не спрацює, бо дані вже були оброблені..
129
129
130
130
```js
131
-
let text = await response.text(); // response body consumed
132
-
let parsed = await response.json(); // fails (already consumed)
131
+
let text = await response.text(); // читаємо тіло відповіді
132
+
let parsed = await response.json(); // завершується помилкою, бо дані вже прочитані
133
133
```
134
134
````
135
135
136
-
## Заголовки запиту
136
+
## Заголовки відповіді
137
137
138
-
Заоголовки запиту зберігаются у схожому на Map об'єкті `response.headers`.
138
+
Заоголовки відповіді зберігаются у схожому на Map об'єкті `response.headers`.
139
139
140
-
Це не зовсім `Map`, але можна використати такі самі методи, як із `Map`, щоб отримати заголовок за його назвою або перебрати заголовки у циклі:
140
+
Це не зовсім `Map`, але можна використовувати такі самі методи, щоб отримати заголовок за його назвою або перебрати заголовки у циклі:
141
141
142
142
```js run async
143
143
let response =awaitfetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
@@ -153,7 +153,7 @@ for (let [key, value] of response.headers) {
153
153
154
154
## Заголовки запиту
155
155
156
-
Для встановлення заголовка запиту в `fetch`, можна використати опцію`headers`option. Вона містит об'єкт з вихідними заголовками, наприклад:
156
+
Для встановлення заголовка запиту в `fetch`, можна використати властивість`headers`в об'єкті `options`. Вона містит об'єкт з вихідними заголовками, наприклад:
157
157
158
158
```js
159
159
let response =fetch(protectedUrl, {
@@ -163,7 +163,7 @@ let response = fetch(protectedUrl, {
163
163
});
164
164
```
165
165
166
-
...Є список [заборонені заголовки HTTP](https://fetch.spec.whatwg.org/#forbidden-header-name), котрі не можна встановити:
166
+
...Але існує список [заборонених HTTP заголовків](https://fetch.spec.whatwg.org/#forbidden-header-name), які не можна встановити:
167
167
168
168
-`Accept-Charset`, `Accept-Encoding`
169
169
-`Access-Control-Request-Headers`
@@ -186,14 +186,14 @@ let response = fetch(protectedUrl, {
186
186
-`Proxy-*`
187
187
-`Sec-*`
188
188
189
-
Ці заголовки забезпечуют достовірність HTTP, через то вони контролюются тільки браузером.
189
+
Ці заголовки забезпечуют достовірність HTTP, через це вони контролюются і встановлюються лише браузером.
190
190
191
191
## POST запити
192
192
193
193
Для відправлення `POST` запиту або запиту з іншим методом, треба використати `fetch` параметри:
194
194
195
195
-**`method`** -- HTTP-метод, наприклад `POST`,
196
-
-**`body`** -- тіло запиту, одне із списку:
196
+
-**`body`** -- тіло запиту, щось одне із списку:
197
197
- рядок (наприклад, у форматі JSON),
198
198
- об'єкт `FormData`, для відправки даних як `multipart/form-data`,
199
199
-`Blob`/`BufferSource` для відправлення бінарних даних,
@@ -223,9 +223,9 @@ let result = await response.json();
223
223
alert(result.message);
224
224
```
225
225
226
-
Зауваження, що оскільки тіло запиту `body` - це рядок, то заголовок `Content-Type`по замовчуванню буде `text/plain;charset=UTF-8` .
226
+
Зверніть увагу, якщо тіло запиту `body` -- рядок, то заголовок `Content-Type`типово буде `text/plain;charset=UTF-8` .
227
227
228
-
Але, оскільки надіслано JSON, то використано парамет `headers`для відправлення замість цього`application/json`, правильний `Content-Type` для JSON формату.
228
+
Але, оскільки ми надсилаємо дані у форматі JSON, то через `headers`ми маємо встановити значення`application/json` -- правильний `Content-Type` для JSON формату.
229
229
230
230
## Відправлення зображення
231
231
@@ -262,7 +262,7 @@ alert(result.message);
262
262
</body>
263
263
```
264
264
265
-
Зауваження, тут не потрібно вручну встановлювати заголовок `Content-Type`, бо об'єкт `Blob` вбудований тип (тут `image/png`, котрий заданий у`toBlob`). Під час відправлення об'єктів `Blob`, він автоматично стає значенням `Content-Type`.
265
+
Зауваження, тут не потрібно вручну встановлювати заголовок `Content-Type`, бо об'єкт `Blob` вбудований тип (буде використано `image/png`, заданий через`toBlob`). Під час відправлення об'єктів `Blob`, він автоматично стає значенням `Content-Type`.
266
266
267
267
Функція `submit()` може бути переписана без `async/await`, наприклад наступним чином:
268
268
@@ -279,9 +279,9 @@ function submit() {
279
279
}
280
280
```
281
281
282
-
## Підсумок
282
+
## Підсумки
283
283
284
-
Типовий запит за домогою`fetch` складаєся із двох операторів `await`:
284
+
Типовий запит за допомогою`fetch` складаєся із двох операторів `await`:
285
285
286
286
```js
287
287
let response =awaitfetch(url, options); // завершення із заголовками відповіді
@@ -297,7 +297,7 @@ fetch(url, options)
297
297
```
298
298
299
299
Параметри відповіді:
300
-
-`response.status` -- HTTP код відповід,
300
+
-`response.status` -- HTTP-статус відповіді,
301
301
-`response.ok` -- `true`, якщо статус відповіді у діапазоні 200-299.
302
302
-`response.headers` -- схожий на `Map`об'єкт із HTTP заголовками.
303
303
@@ -308,9 +308,9 @@ fetch(url, options)
308
308
-**`response.blob()`** -- повертає об'єкт як [Blob](info:blob) (бінарні дані з типом),
309
309
-**`response.arrayBuffer()`** -- повертає відповідь як [ArrayBuffer](info:arraybuffer-binary-arrays) (низько рівневі бінарні дані),
310
310
311
-
Опції `fetch`, котрі на даний момент вивчено:
311
+
Опції `fetch`, які ми розглянули:
312
312
-`method` -- HTTP-метод,
313
-
-`headers` -- об'єкт із запитуваними заголовками (не всі заголовки дозволені),
313
+
-`headers` -- об'єкт із заголовками запиту (не всі заголовки дозволені),
314
314
-`body` -- дані для відправлення (тіло запиту) у вигляді тексту `string`, `FormData`, `BufferSource`, `Blob` або `UrlSearchParams` об'єкт.
315
315
316
316
У наступних розділах буде розглянуто більше параметрів та варіантів використання `fetch`.
0 commit comments