JavaScript · API · Початковий
Пагінація
Переходьте по сторінках відповідей API для збору всіх результатів.
Короткий вступ до теми та пояснення перед вправами (вправи нижче):
Паттерни пагінації
#Довідник пагінації
#Вправи:
Отримати 2-у сторінку
#Отримайте 2-у сторінку `/api/products/` за допомогою параметра `page`. Виведіть кількість результатів на цій сторінці та назву першого товару.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// fetch 2-ї сторінки і вивести results.length + назву першого товару
}
main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
const params = new URLSearchParams({ page: 2 });
const response = await fetch(`${BASE_URL}/api/products/?${params}`);
const data = await response.json();
console.log(data.results.length);
console.log(data.results[0].name);
}
main();
Слідувати по next для збору всіх сторінок
#Напишіть цикл, що переходить по `data.next`, поки він не стане `null`. Підрахуйте загальну кількість товарів на всіх сторінках і виведіть результат.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let total = 0;
// цикл: fetch url, додати до total, url = data.next
}
main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let total = 0;
while (url) {
const response = await fetch(url);
const data = await response.json();
total += data.results.length;
url = data.next;
}
console.log(total);
}
main();
Зібрати всі товари у масив
#Напишіть функцію `getAllProducts()`, яка пагінує всі сторінки з `page_size=100` і повертає плоский масив усіх товарів. Виведіть загальну довжину.
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAllProducts() {
// пагінація з page_size=100, повернути плоский масив
}
async function main() {
const all = await getAllProducts();
console.log(all.length);
}
main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';
async function getAllProducts() {
let url = `${BASE_URL}/api/products/?page_size=100`;
const all = [];
while (url) {
const response = await fetch(url);
const data = await response.json();
all.push(...data.results);
url = data.next;
}
return all;
}
async function main() {
const all = await getAllProducts();
console.log(all.length);
}
main();
Знайти найдорожчий товар
#Завантажте всі товари (пагінуйте всі сторінки), потім знайдіть той з найвищою ціною. Виведіть його назву та ціну.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
// зібрати всі товари по сторінках
// знайти найдорожчий
}
main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/?page_size=100`;
const all = [];
while (url) {
const response = await fetch(url);
const data = await response.json();
all.push(...data.results);
url = data.next;
}
const mostExpensive = all.reduce((max, p) =>
parseFloat(p.price) > parseFloat(max.price) ? p : max
);
console.log(mostExpensive.name, mostExpensive.price);
}
main();
Підрахунок товарів на кожній сторінці
#Отримайте всі сторінки `/api/products/` з розміром сторінки за замовчуванням. Для кожної виведіть `"Сторінка N: X товарів"`. Наприкінці виведіть загальну суму.
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let page = 1;
let total = 0;
// перебирати сторінки і виводити інформацію
}
main();
Рішення
const BASE_URL = 'https://apilearn.tukas.dev';
async function main() {
let url = `${BASE_URL}/api/products/`;
let page = 1;
let total = 0;
while (url) {
const response = await fetch(url);
const data = await response.json();
console.log(`Page ${page}: ${data.results.length} products`);
total += data.results.length;
url = data.next;
page++;
}
console.log(`Total: ${total} products across ${page - 1} pages`);
}
main();