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();