zaprosi_do_http_api

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
zaprosi_do_http_api [2024/01/24 19:34]
tro
zaprosi_do_http_api [2024/01/24 19:56] (текущий)
tro
Строка 1: Строка 1:
 ====== Запроси до HTTP / Api ====== ====== Запроси до HTTP / Api ======
-===== fetch (відправка запиту) =====+====== fetch (відправка запиту) ======
 Набір властивостей і методів, які дозволяють відправляти, отримувати та обробляти ресурси із сервера. Набір властивостей і методів, які дозволяють відправляти, отримувати та обробляти ресурси із сервера.
 <code> <code>
Строка 14: Строка 14:
   });   });
 </code> </code>
-==== Коди відповідей сервера HTTP/s ====+===== Коди відповідей сервера HTTP/=====
 [[https://www.webfx.com/web-development/glossary/http-status-codes/|Довідник HTTP-кодів]] [[https://www.webfx.com/web-development/glossary/http-status-codes/|Довідник HTTP-кодів]]
   * 1XX — мають інформаційне призначення   * 1XX — мають інформаційне призначення
Строка 29: Строка 29:
   * 404 (Not Found) — у цей час ресурс не знайдений. Можливо, він був видалений або ще не існує.   * 404 (Not Found) — у цей час ресурс не знайдений. Можливо, він був видалений або ще не існує.
   * 500 (Internal Server Error) — загальна відповідь на непередбачений збій сервера, якщо відсутня конкретніша інформація.   * 500 (Internal Server Error) — загальна відповідь на непередбачений збій сервера, якщо відсутня конкретніша інформація.
-==== fetch (перевірка відповіді) ====+===== fetch (перевірка відповіді) =====
 Значення промісу, який повертає метод fetch() — це об'єкт зі службовою інформацією про стан відповіді сервера. Цей об’єкт є екземпляром класу Response, який включає різні методи та властивості. Залежно від типу отримуваного контенту, використовуються різні методи для перетворення тіла відповіді у дані. Значення промісу, який повертає метод fetch() — це об'єкт зі службовою інформацією про стан відповіді сервера. Цей об’єкт є екземпляром класу Response, який включає різні методи та властивості. Залежно від типу отримуваного контенту, використовуються різні методи для перетворення тіла відповіді у дані.
   * **json()** — парсить дані у JSON-форматі.   * **json()** — парсить дані у JSON-форматі.
Строка 54: Строка 54:
   });   });
 </code> </code>
-==== HTTP-методи ==== +===== HTTP-методи (CRUD) ===== 
-  * **POST** — створити новий ресурс +  * **POST** — створити новий ресурс (**C**reate)  
-  * **GET** — отримати набір ресурсів або один ресурс +  * **GET** — отримати набір ресурсів або один ресурс (**R**ead) 
-  * **PUT** — оновити існуючий або створити новий ресурс +  * **PUT** — оновити існуючий або створити новий ресурс (**U**pdate) 
-  * **PATCH** — оновити існуючий ресурс +  * **PATCH** — оновити існуючий ресурс (Update) 
-  * **DELETE** — видалити ресурс+  * **DELETE** — видалити ресурс(**D**elete) 
 + 
 + = CRUD
 <code> <code>
 const options = { const options = {
Строка 80: Строка 82:
 </code> </code>
 **Для GET-запиту вказувати його в опціях fetch не потрібно, це метод запиту за замовчуванням.** **Для GET-запиту вказувати його в опціях fetch не потрібно, це метод запиту за замовчуванням.**
-==== HTTP-заголовки ====+===== HTTP-заголовки =====
 Заголовки містять службову інформацію, що стосується запиту або відповіді.  Заголовки містять службову інформацію, що стосується запиту або відповіді. 
 Наприклад: Наприклад:
Строка 97: Строка 99:
 }); });
 </code> </code>
-==== Кросдоменні запити ====+===== Кросдоменні запити =====
 За замовчуванням HTTP-запит можна робити тільки в рамках поточного сайту. При спробі запиту на інший домен, порт або протокол (тобто при спробі виконати кросдоменний запит), браузер видає помилку. Це зроблено з міркувань безпеки, і права доступу налаштовуються на бекенді. Якщо бекенд не підтримує кросдоменні запити, фронтенд-розробник нічого не зможе з цим зробити у своєму коді. За замовчуванням HTTP-запит можна робити тільки в рамках поточного сайту. При спробі запиту на інший домен, порт або протокол (тобто при спробі виконати кросдоменний запит), браузер видає помилку. Це зроблено з міркувань безпеки, і права доступу налаштовуються на бекенді. Якщо бекенд не підтримує кросдоменні запити, фронтенд-розробник нічого не зможе з цим зробити у своєму коді.
 На кожному запиті браузер сам додає HTTP-заголовок Origin, де вказує адресу вебсторінки, яка хоче зробити HTTP-запит. Наприклад, якщо ми робимо fetch-запит із вебсторінки https://my-site.com/about на https://my-api.com/users, то заголовки будуть наступними: На кожному запиті браузер сам додає HTTP-заголовок Origin, де вказує адресу вебсторінки, яка хоче зробити HTTP-запит. Наприклад, якщо ми робимо fetch-запит із вебсторінки https://my-site.com/about на https://my-api.com/users, то заголовки будуть наступними:
Строка 106: Строка 108:
 </code> </code>
 ===== AJAX (Asynchronous JavaScript and XML) ===== ===== AJAX (Asynchronous JavaScript and XML) =====
 +Метод отримання або відправлення даних з подальшим оновленням інтерфейсу за цими даними, без потреби перезавантаження сторінки. Завдяки цьому зменшується час відгуку і вебсторінка стає інтерактивнішою.
 +Незважаючи на те, що в назві технології присутній XML, у сучасному інтернеті його замінив JSON, а назву залишили як данину пам'яті. AJAX трактується як будь-яке спілкування з сервером без перезавантаження сторінки.
 +<code>
 +const fetchUsersBtn = document.querySelector(".btn");
 +const userList = document.querySelector(".user-list");
  
 +fetchUsersBtn.addEventListener("click", () => {
 +  fetch("<https://jsonplaceholder.typicode.com/users>")
 +    .then((response) => {
 +      if (!response.ok) {
 +        throw new Error(response.status);
 +      }
 +      return response.json();
 +    })
 +    .then((users) => {
 +      const markup = users.map((user) => {
 + return `<li>
 +           <p><b>Name</b>: ${user.name}</p>
 +           <p><b>Email</b>: ${user.email}</p>
 +           <p><b>Company</b>: ${user.company.name}</p>
 +         </li>`;
 +        })
 +        .join("");
 +
 + userList.insertAdjacentHTML("beforeend", markup);
 +    })
 +    .catch((error) => console.log(error));
 +});
 +</code>
 +====== GET (Запит) ======
 +===== Параметри рядка запиту =====
 +Символ ? вказує на початок параметрів запиту. Кожен параметр — це пара ім'я=значення.
 +<code>
 +fetch("https://jsonplaceholder.typicode.com/users?_limit=7&_sort=name")
 +</code>
 +==== Клас URLSearchParams ====
 +Параметрів може бути багато, і незручно складати з них один довгий рядок як для читабельності, так і для його подальшого редагування.
 +Під час складання рядків параметрів, створюється екземпляр класу URLSearchParams та ініціалізується об'єктом. Результатом буде спеціальний об'єкт (ітератор) з методами, який у рядковому перетворенні повертає результат виклику методу toString() — своє рядкове відображення.
 +
 +**Приклад 1**
 +<code>
 +const searchParams = new URLSearchParams({
 +  _limit: 5,
 +  _sort: "name",
 +});
 +
 +console.log(searchParams.toString()); // "_limit=5&_sort=name"
 +const url = `https://jsonplaceholder.typicode.com/users?${searchParams}`;
 +
 +console.log(url); // "<https://jsonplaceholder.typicode.com/users?_limit=5&_sort=name>"
 +</code>
 +У разі інтерполяції значення в шаблонних рядках відбувається його неявне перетворення в рядок, тому не потрібно викликати метод toString() під час складання URL. Не забувай вказувати початок рядка запиту символом ?.
 +
 +**Приклад 2**
 +<code>
 +// Change this number to fetch different post
 +const postId = 1;
 +
 +fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`)
 +  .then((response) => {
 +    if (!response.ok) {
 +      throw new Error(response.status);
 +    }
 +    return response.json();
 +  })
 +  .then(post => console.log(post))
 +  .catch(error => console.log(error));
 +</code>
 +====== Post (Створення) ======
 +Метод POST використовується для додавання нового ресурсу.
 +<code>
 +const postToAdd = {
 +  title: "CRUD",
 +  body: "CRUD is awesome!",
 +};
 +
 +const options = {
 +  method: "POST",
 +  body: JSON.stringify(postToAdd),
 +  headers: {
 +    "Content-Type": "application/json; charset=UTF-8",
 +  },
 +};
 +
 +fetch("<https://jsonplaceholder.typicode.com/posts>", options)
 +  .then((response) => {
 +    if (!response.ok) {
 +      throw new Error(response.status);
 +    }
 +    return response.json();
 +  })
 +  .then(post => console.log(post))
 +  .catch(error => console.log(error));
 +</code>
 +====== PUT і PATCH (Оновлення) ======
 +Використовуються для оновлення існуючих даних.
 +За HTTP-стандартом:
 +  * PATCH замінює в наявному ресурсі значення, які були передані в тілі запиту. Значення ресурсу, які не передавались, лишаться без змін;
 +  * PUT повністю замінює ресурс. Значення ресурсу, які не передавались, видаляються з ресурсу.
 +
 +<code>
 +// Change value of id property to update different post
 +const postToUpdate = {
 +  id: 1,
 +  body: "CRUD is really awesome!",
 +};
 +
 +const options = {
 +  method: "PATCH",
 +  body: JSON.stringify(postToUpdate),
 +  headers: {
 +    "Content-Type": "application/json; charset=UTF-8",
 +  },
 +};
 +
 +fetch(`https://jsonplaceholder.typicode.com/posts/${postToUpdate.id}`, options)
 +  .then((response) => {
 +    if (!response.ok) {
 +      throw new Error(response.status);
 +    }
 +    return response.json();
 +  })
 +  .then(post => console.log(post))
 +  .catch(error => console.log("ERROR:", error));
 +</code>
 +====== DELETE (Видалення) ======
 +використовується для видалення існуючих даних
 +<code>
 +const postIdToDelete = 1;
 +
 +fetch(`https://jsonplaceholder.typicode.com/posts/${postIdToDelete}`, {
 +  method: "DELETE",
 +})
 +  .then((response) => {
 +    if (!response.ok) {
 +      throw new Error(response.status);
 +    }
 +    return response.json();
 +  })
 +  .then((deletedPost) => console.log(deletedPost))
 +  .catch(error => console.log("Error:", error));
 +</code>
  
  • /sites/data/attic/zaprosi_do_http_api.1706124867.txt.gz
  • Последнее изменение: 2024/01/24 19:34
  • tro