JavaScript · API · Середній

Кошик

5 завдань

Додавайте, оновлюйте і видаляйте товари з кошика за допомогою автентифікованих запитів.

Огляд API кошика

#
API кошика керує кошиком, прив'язаним до вашого акаунту. Всі ендпоінти кошика вимагають заголовок `Authorization`. Дві групи ендпоінтів: Огляд кошика: ``` GET /api/cart/ Переглянути кошик (загальна ціна, список товарів) ``` Позиції кошика: ``` POST /api/cart/items/ Додати товар PATCH /api/cart/items/{id}/ Оновити кількість однієї позиції DELETE /api/cart/items/{id}/ Видалити одну позицію DELETE /api/cart/items/ Очистити всі позиції ``` Форма відповіді GET /api/cart/: ```javascript { items: [ { id: 42, // id позиції кошика (не id товару) product: { id: 7, name: "Oak Chair", price: "149.99", ... }, quantity: 1, products_price: "149.99" } ], total_price: "149.99", total_quantity: 1 } ``` Кожна позиція має свій `id` — він потрібен для оновлення або видалення. Щоб додати товар, потрібен його `slug`, а не `id`.

Додавання, оновлення та видалення позицій кошика

#
Повний робочий процес з кошиком через fetch: ```javascript const BASE_URL = 'https://apilearn.tukas.dev'; async function getToken() { const { token } = await fetch(`${BASE_URL}/api/auth/token/`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }), }).then(r => r.json()); return token; } async function main() { const token = await getToken(); const headers = { 'Authorization': `Token ${token}`, 'Content-Type': 'application/json', }; // Переглядаємо кошик const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json()); console.log('Позицій у кошику:', cart.items.length); // Отримуємо slug товару const product = await fetch(`${BASE_URL}/api/products/1/`).then(r => r.json()); const slug = product.slug; // Додаємо до кошика const item = await fetch(`${BASE_URL}/api/cart/items/`, { method: 'POST', headers, body: JSON.stringify({ product_slug: slug, quantity: 2 }), }).then(r => r.json()); console.log('Id позиції кошика:', item.id); // Оновлюємо кількість const updated = await fetch(`${BASE_URL}/api/cart/items/${item.id}/`, { method: 'PATCH', headers, body: JSON.stringify({ quantity: 5 }), }).then(r => r.json()); console.log('Нова кількість:', updated.quantity); // Видаляємо одну позицію await fetch(`${BASE_URL}/api/cart/items/${item.id}/`, { method: 'DELETE', headers, }); // Очищаємо весь кошик await fetch(`${BASE_URL}/api/cart/items/`, { method: 'DELETE', headers }); const empty = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json()); console.log('Позицій після очищення:', empty.items.length); // 0 } main(); ```

Довідник API кошика

#
**Ендпоінти (всі потребують Authorization)** ``` GET /api/cart/ Переглянути кошик POST /api/cart/items/ Додати позицію тіло: { product_slug: string, quantity: number } повертає: 201 + об'єкт позиції кошика PATCH /api/cart/items/{id}/ Оновити кількість тіло: { quantity: number } повертає: 200 + оновлена позиція DELETE /api/cart/items/{id}/ Видалити одну позицію → 204 DELETE /api/cart/items/ Очистити всі позиції → 204 ``` **Форма відповіді кошика** ```javascript { items: [...], total_price: "149.99", total_quantity: 1 } ``` **Об'єкт позиції кошика** ```javascript { id: 42, product: {...}, quantity: 2, products_price: "299.98" } ``` **Ключова відмінність** ``` product.slug — використовується при додаванні до кошика (тіло POST) item.id — використовується при оновленні/видаленні (параметр URL) ``` **DELETE повертає 204 — без тіла** ```javascript // Не викликайте .json() на відповідь 204 await fetch(url, { method: 'DELETE', headers }); // Перевірте response.ok, якщо потрібно підтвердити успіх ```
01

Переглянути кошик

#

Авторизуйтесь та надішліть GET до `/api/cart/`. Виведіть кількість товарів у кошику та `total_price`.

const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  // 1. отримати токен
  // 2. GET /api/cart/ і вивести кількість товарів та total_price
}

main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
  }).then(r => r.json());

  const headers = { 'Authorization': `Token ${token}` };
  const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json());
  console.log(cart.items.length);
  console.log(cart.total_price);
}

main();
02

Додати товар до кошика

#

Знайдіть будь-який товар у `/api/products/` і додайте його до кошика з кількістю 1. Виведіть `id` позиції кошика з відповіді.

const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  // 1. отримати токен
  // 2. отримати slug товару з /api/products/
  // 3. POST до /api/cart/items/ і вивести id позиції
}

main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
  }).then(r => r.json());

  const headers = {
    'Authorization': `Token ${token}`,
    'Content-Type': 'application/json',
  };

  const slug = await fetch(`${BASE_URL}/api/products/`).then(r => r.json())
    .then(d => d.results[0].slug);

  const item = await fetch(`${BASE_URL}/api/cart/items/`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ product_slug: slug, quantity: 1 }),
  }).then(r => r.json());

  console.log(item.id);
}

main();
03

Оновити кількість товару

#

Додайте товар до кошика, потім оновіть його кількість до 3 за допомогою PATCH. Виведіть оновлену кількість із відповіді.

const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  // 1. авторизуватись
  // 2. додати товар
  // 3. PATCH кількість до 3
  // 4. вивести оновлену кількість
}

main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
  }).then(r => r.json());

  const headers = {
    'Authorization': `Token ${token}`,
    'Content-Type': 'application/json',
  };

  const slug = await fetch(`${BASE_URL}/api/products/`).then(r => r.json())
    .then(d => d.results[0].slug);

  const item = await fetch(`${BASE_URL}/api/cart/items/`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ product_slug: slug, quantity: 1 }),
  }).then(r => r.json());

  const updated = await fetch(`${BASE_URL}/api/cart/items/${item.id}/`, {
    method: 'PATCH',
    headers,
    body: JSON.stringify({ quantity: 3 }),
  }).then(r => r.json());

  console.log(updated.quantity);
}

main();
04

Видалити одну позицію

#

Додайте товар до кошика, потім видаліть його через DELETE `/api/cart/items/{id}/`. Переконайтесь, що кошик порожній, запитавши його знову і вивівши кількість товарів.

const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  // додати товар, видалити його, перевірити що кошик порожній
}

main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
  }).then(r => r.json());

  const headers = {
    'Authorization': `Token ${token}`,
    'Content-Type': 'application/json',
  };

  const slug = await fetch(`${BASE_URL}/api/products/`).then(r => r.json())
    .then(d => d.results[0].slug);

  const item = await fetch(`${BASE_URL}/api/cart/items/`, {
    method: 'POST', headers,
    body: JSON.stringify({ product_slug: slug, quantity: 1 }),
  }).then(r => r.json());

  await fetch(`${BASE_URL}/api/cart/items/${item.id}/`, { method: 'DELETE', headers });

  const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json());
  console.log(cart.items.length);  // 0
}

main();
05

Додати два товари і очистити кошик

#

Додайте два різних товари до кошика. Виведіть `total_price`. Потім очистіть весь кошик через DELETE `/api/cart/items/` і перевірте, що він порожній.

const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  // додати 2 товари, вивести total_price, очистити кошик, перевірити що порожній
}

main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';

async function main() {
  const { token } = await fetch(`${BASE_URL}/api/auth/token/`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username: 'YOUR_USERNAME', password: 'YOUR_PASSWORD' }),
  }).then(r => r.json());

  const headers = {
    'Authorization': `Token ${token}`,
    'Content-Type': 'application/json',
  };

  const products = await fetch(`${BASE_URL}/api/products/`).then(r => r.json())
    .then(d => d.results);

  for (const p of products.slice(0, 2)) {
    await fetch(`${BASE_URL}/api/cart/items/`, {
      method: 'POST', headers,
      body: JSON.stringify({ product_slug: p.slug, quantity: 1 }),
    });
  }

  const cart = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json());
  console.log('Total:', cart.total_price);

  await fetch(`${BASE_URL}/api/cart/items/`, { method: 'DELETE', headers });

  const empty = await fetch(`${BASE_URL}/api/cart/`, { headers }).then(r => r.json());
  console.log('After clear:', empty.items.length);
}

main();