Gernar
Frontend DeveloperHTTP, API и сеть

Интервью-вопрос

Что такое API

API это контракт между программами: что можно запросить, какие данные передать, какой ответ получить и какие ошибки обработать. Для frontend важно связать определение с реальным UI: состояниями загрузки, ошибками, безопасностью и изменением контракта.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Как лучше кратко объяснить API?

Вы отвечаете на базовый вопрос и не хотите сузить API до одной ссылки.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

API это не просто адрес сервера. Это интерфейс, то есть набор правил, по которым одна часть системы может использовать возможности другой части системы.

В frontend под API часто имеют в виду серверный HTTP API. Например, интерфейс вызывает GET /api/products, получает список товаров в JSON и рендерит карточки. Но само понятие шире: fetch, DOM, браузерная геолокация, SDK платежного сервиса и методы библиотеки тоже имеют API.

На интервью короткий ответ может звучать так: API описывает доступные операции, входные данные, формат ответа, статусы ошибок и правила доступа. Он помогает frontend и backend развиваться отдельно, пока обе стороны соблюдают контракт.

Как построить ответ на интервью

Хороший ответ лучше строить не как определение из словаря, а как понятную цепочку.

  1. Сначала скажите, что API это контракт взаимодействия.
  2. Затем привяжите к frontend: запросы к серверу, endpoints, HTTP методы, JSON, статусы.
  3. Потом добавьте практический риск: UI зависит от стабильности контракта и обработки ошибок.
  4. В конце приведите короткий пример из интерфейса.

Пример ответа:

API это контракт, который описывает, как одно приложение обращается к другому. В frontend это часто HTTP API: я делаю запрос на endpoint, передаю параметры или тело запроса, получаю JSON и по статусу понимаю, что показать пользователю. Важно не зависеть от внутренней реализации сервера, но соблюдать публичный контракт и обрабатывать ошибки, авторизацию и неожиданные данные.

Как выбрать акцент в ответе

1Нужно дать короткое определение?
Скажите, что API это контракт для взаимодействия программ.
2Нужно привязать к frontend?
Упомяните HTTP запросы, endpoints, JSON, статусы и обработку ошибок в UI.
3Нужно показать глубину?
Добавьте версии контракта, схему ответа, авторизацию и риск breaking changes.
4Нужно привести пример?
Возьмите простой сценарий: список товаров, профиль пользователя или отправка формы.

Что API значит для frontend-кода

Для frontend API почти сразу превращается в состояния интерфейса. Пока запрос идет, нужен loading state. Если данных нет, нужен empty state. Если сервер вернул ошибку или пользователь не авторизован, нужен понятный сценарий, а не сломанный компонент.

Плохой вариант: сделать запрос, сразу вызвать json() и считать, что данные всегда нужной формы. Такой код ломается при 401, 500, пустом ответе, изменении поля или быстром переходе пользователя на другую страницу.

Более безопасный пример:

import { useEffect, useState } from "react";

export function Products() {
  const [products, setProducts] = useState([]);
  const [status, setStatus] = useState("loading");

  useEffect(() => {
    const controller = new AbortController();

    async function loadProducts() {
      try {
        setStatus("loading");

        const response = await fetch("/api/products", {
          signal: controller.signal,
        });

        if (!response.ok) {
          throw new Error(`HTTP ${response.status}`);
        }

        const data = await response.json();
        setProducts(Array.isArray(data.items) ? data.items : []);
        setStatus("success");
      } catch (error) {
        if (error.name === "AbortError") return;
        setStatus("error");
      }
    }

    loadProducts();

    return () => controller.abort();
  }, []);

  if (status === "loading") return <p>Загрузка...</p>;
  if (status === "error") return <p>Не удалось загрузить товары</p>;
  if (products.length === 0) return <p>Товаров пока нет</p>;

  return products.map((product) => <ProductCard key={product.id} product={product} />);
}

Этот пример не идеален для любого проекта, но он показывает важную мысль. API вызов связан с жизненным циклом компонента, проверкой статуса, проверкой данных и fallback для пользователя.

Безопаснее
  1. 1Показать loading state
  2. 2Сделать запрос и проверить <code>response.ok</code>
  3. 3Проверить форму данных перед рендером
  4. 4Показать empty или error state
  5. 5Отменить устаревший запрос при размонтировании
Опасно
  1. 1Сразу считать ответ успешным
  2. 2Игнорировать <code>401</code>, <code>403</code> и <code>500</code>
  3. 3Рендерить поля без проверки
  4. 4Показывать общий toast на любую ошибку
  5. 5Оставлять старый запрос обновлять уже неактуальный экран

Контракт важнее внутренней реализации

Frontend обычно не должен знать, как backend хранит данные, какие таблицы использует и какие внутренние сервисы дергает. Ему важен публичный контракт: endpoint, метод, параметры, схема ответа, статусы и правила авторизации.

Если контракт стабилен, backend может менять внутреннюю реализацию без поломки интерфейса. Если контракт меняется без договоренности, frontend ломается даже при рабочем сервере. Например, поле user.name стало user.fullName, массив стал объектом, или null пришел там, где компонент ждал строку.

Поэтому сильный ответ не ограничивается фразой про удобную интеграцию. Добавьте, что API требует документации, версионирования и согласованной обработки ошибок.

Что учитывать при работе с API во frontend

Статус ответа2xx, 4xx, 5xx

Не считайте любой ответ успешным. Иначе UI покажет старые данные или потеряет понятную ошибку.

Формат данныхJSON schema

Проверяйте обязательные поля и nullable значения. Иначе компонент упадет при рендере.

Авторизация401, 403

Разделяйте неавторизованного пользователя и запрет доступа. Это влияет на redirect и текст ошибки.

Ограничения429, rate limit

Не запускайте бесконечный retry. Нужны backoff, disable кнопки или понятное ожидание.

Внешние данныеXSS, HTML

Не вставляйте HTML из ответа без санитайза. Иначе один зараженный текст выполнит скрипт в браузере.

Изменение контрактаversioning

Договаривайтесь о совместимости. Резкое переименование поля может сломать релиз фронтенда.

REST, GraphQL, WebSocket и другие API

Не нужно превращать ответ на вопрос про API в сравнение всех подходов. Но полезно показать, что API не равен REST.

REST API обычно строится вокруг ресурсов и HTTP методов: GET получить, POST создать или выполнить действие, PUT заменить, PATCH частично обновить, DELETE удалить. GraphQL дает клиенту возможность запросить нужную форму данных через схему. WebSocket API подходит для двустороннего обмена в реальном времени, например для чата или live-уведомлений.

Для интервью достаточно такой формулировки: REST это популярный способ проектировать HTTP API, но API как понятие шире. Главное, чтобы между клиентом и сервером был понятный контракт и frontend корректно обрабатывал его поведение.

Безопасность и права доступа

В ответе про API стоит аккуратно упомянуть безопасность. API часто работает с пользовательскими данными, платежами, профилями и внутренними действиями. Поэтому запросы идут по HTTPS, а доступ контролируется токенами, cookies, сессиями, OAuth или другими механизмами.

Для frontend особенно важна граница секретов. Нельзя класть приватный API key в код, который попадет в браузер. Пользователь может открыть DevTools, посмотреть network-запросы, bundle и переменные, которые доступны на клиенте.

Данные из API тоже остаются внешними данными. Текст можно рендерить как текст, а HTML из CMS или пользовательского поля нельзя вставлять в DOM без санитайза. Если авторизация построена на cookies, для изменяющих запросов важно учитывать CSRF: frontend и backend должны договориться про SameSite, CSRF token или другой защитный механизм.

Еще один важный нюанс: 401 и 403 не одно и то же. 401 обычно означает, что пользователь не прошел аутентификацию. 403 означает, что пользователь известен, но у него нет прав. В UI это разные реакции.

Практический вывод

На интервью вам не нужно доказывать, что вы знаете все виды API. Лучше показать, что вы понимаете роль API как контракта и умеете думать про последствия для интерфейса.

Сильный короткий финал может звучать так:

Для меня API это граница между частями системы. Frontend использует эту границу, чтобы получать и менять данные, но обязан уважать контракт: методы, параметры, формат ответа, статусы, авторизацию и ограничения. Если контракт меняется или ошибки не обработаны, пользователь увидит плохой UX даже при рабочем backend.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Сводить API к URL

    URL это только точка входа. API включает методы, параметры, формат ответа, статусы, авторизацию, лимиты и договоренность о совместимости. Если сказать только про ссылку, ответ будет звучать слишком поверхностно для frontend-разработчика.
  2. 2

    Не различать успешный HTTP ответ и валидные данные

    200 говорит, что сервер обработал запрос, но не гарантирует, что данные подходят вашему UI. Проверьте структуру ответа и nullable поля, иначе компонент может упасть или показать неверный экран.
  3. 3

    Путать аутентификацию и авторизацию

    Аутентификация отвечает на вопрос, кто пользователь. Авторизация отвечает, что ему разрешено. Для frontend это разные сценарии: при 401 часто нужен login flow, а при 403 нужен экран запрета или скрытие действия.
  4. 4

    Игнорировать жизненный цикл запроса

    Запрос может завершиться после ухода со страницы или после нового запроса. Без отмены или проверки актуальности вы получите race condition, мигание старых данных или предупреждения при обновлении состояния.
  5. 5

    Класть секреты в клиентский код

    API ключ, попавший в bundle, больше не секрет. Для приватных ключей нужен backend proxy, server-side вызов или короткоживущий токен с ограниченными правами.
  6. 6

    Доверять HTML из ответа API

    Текст и HTML из API остаются внешними данными. React экранирует текстовые значения, но dangerouslySetInnerHTML без санитайза может привести к XSS. Безопаснее хранить текст как текст, валидировать формат и разрешать только проверенную разметку.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание API, сетевых запросов и рисков для интерфейса.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание