Сравнение и избранное
Оба списка привязаны к сессии браузера, а у вошедшего покупателя ещё и к его профилю. Запросы без cookie сессии видят пустой список.
Актуальные адреса — /front_api/compares.json и /front_api/favorites.json. Старый GET /compares.json тоже отдаёт { "products": [] }. GET /favorites.json отвечает HTML-страницей избранного, не JSON.
В карточках товаров те же поля, что у списка товаров.
Сравнение
Добавление передаёт id товара. Повторный запрос с тем же id не создаёт вторую карточку.
| Параметр | Описание |
|---|---|
product[id] обязательныйчисло |
id товара. Повторный запрос с тем же id не создаёт вторую карточку. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/compares.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({ product: { id: 761 } })
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"products": [
{
"id": 761,
"title": "Apple iPhone 16 128 ГБ",
"url": "/product/apple-iphone-16-128-gb",
"available": true,
"price_min": 84990.0
}
]
}
GET /front_api/compares.json возвращает тот же список без поля status: { "products": [] }, если сравнение пустое.
Удаление одного товара. id в адресе — id товара.
| Параметр | Описание |
|---|---|
id обязательныйчисло |
id товара в адресе. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const body = new URLSearchParams({ _method: "delete" });
const response = await fetch("/front_api/compares/761.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/x-www-form-urlencoded",
"X-CSRF-Token": csrfToken
},
body
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"products": []
}
Очистка: POST /front_api/compares/clear.json с тем же заголовком CSRF. Ответ снова { "status": "ok", "products": [] }.
Старый POST /compares.json с телом product[id] отвечает только { "status": "ok" }, без списка товаров. Удаление — POST /compares/:id.json с _method=delete, ответ тот же короткий объект.
Избранное
Тело и адреса совпадают со сравнением, путь другой: /front_api/favorites.json.
| Параметр | Описание |
|---|---|
product[id] обязательныйчисло |
id товара. Тело совпадает со сравнением. |
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/favorites.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"X-CSRF-Token": csrfToken
},
body: JSON.stringify({ product: { id: 761 } })
});
const data = await response.json();
Ответ · 200
{
"status": "ok",
"products": [
{
"id": 761,
"title": "Apple iPhone 16 128 ГБ",
"url": "/product/apple-iphone-16-128-gb",
"available": true
}
]
}
GET /front_api/favorites.json без товаров: { "products": [] }.
POST /front_api/favorites/:id.json с _method=delete возвращает список без удалённого товара и status: "ok".
Очистка отвечает короче, чем очистка сравнения:
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
const response = await fetch("/front_api/favorites/clear.json", {
method: "POST",
credentials: "same-origin",
headers: {
Accept: "application/json",
"X-CSRF-Token": csrfToken
}
});
const data = await response.json();
Ответ · 200
{ "status": "ok" }