Какие ключевые различия в проектировании API для мобильных и веб-приложений?

Ответ

Хотя мобильные и веб-клиенты могут использовать один и тот же backend API, их требования к нему часто различаются из-за особенностей платформ.

Основные различия в проектировании API

  1. Оптимизация данных и трафика

    • Мобильное API: Часто возвращает только необходимые поля (например, используя GraphQL или параметры типа ?fields=id,name). Это экономит трафик, время загрузки и заряд батареи.
    • Веб-API: Может позволять себе возвращать более полные объекты с дополнительной мета-информацией, так как веб-соединение обычно стабильнее.
  2. Управление версиями и обратная совместимость

    • Мобильное API: Требует строгого контроля версий (например, /v2/users). Пользователи не всегда сразу обновляют приложение, поэтому старые версии API должны поддерживаться дольше.
    • Веб-API: Обновление происходит мгновенно с обновлением страницы, поэтому можно чаще вносить обратно-совместимые изменения.
  3. Авторизация и аутентификация

    • Мобильное API: Чаще используют долгоживущие токены доступа (JWT) и механизм refresh-токенов, так как управление сессиями и куками на мобильных устройствах менее надежно.
    • Веб-API: Чаще полагаются на сессии и куки, управляемые браузером.
  4. Кэширование

    • Мобильное API: Клиентское кэширование часто реализуется в локальной БД устройства (SQLite, Realm).
    • Веб-API: Активно используют стандартные HTTP-заголовки кэширования (Cache-Control, ETag).

Пример ответа API для мобильного клиента (минималистичный):

{
  "id": 123,
  "name": "John Doe",
  "avatarUrl": "https://cdn.example.com/avatar.jpg"
}

Пример для веб-клиента (расширенный):

{
  "id": 123,
  "name": "John Doe",
  "email": "john@example.com",
  "avatarUrl": "https://cdn.example.com/avatar.jpg",
  "meta": {
    "createdAt": "2023-01-15",
    "lastLogin": "2023-10-26"
  }
}

Ответ 18+ 🔞

А, ну вот, опять про эти ваши API, блядь! Сидишь, думаешь, ну один бэкенд, один код — и всем хорошо, да? Как бы не так, ёпта! Мобилка и веб — это как два разных зверя, один в тапке сидит, а другой по джунглям скачет. И кормить их надо по-разному, иначе один сожрёт всё и обосрётся, а второй сдохнет с голоду.

Так, блядь, в чём же разница, спросишь ты?

  1. Про трафик и батарейку, ебать мои старые костыли

    • Для телефона: Тут, сука, каждый байт на счету. Батарейка садится, связь хромает. Поэтому API должно отдавать только самое нужное, как будто ты в походе и считаешь каждую крошку. GraphQL или ?fields=id,name — вот твои лучшие друзья.
    • Для веба: Ну тут-то что? Розетка рядом, вайфай стабильный. Можно и полный объект с метаданными отправить, пусть браузер думает. Жирно не будет.
  2. Версии, или "Почему мой старый айфон всё ещё должен работать"

    • Для телефона: Тут пиздец, чувак. Люди годами не обновляют приложения! Поэтому версии API (/v2/users) — это святое. Старый код должен жить, пока последний юзер с кнопочной звонилкой не откинется.
    • Для веба: Обновил сервер — у всех всё сразу новое. Страница перезагрузилась и поехала. Можно потихоньку менять, главное — не сломать обратно.
  3. Кто ты такой, и на каком основании?

    • Для телефона: Сессии с куками — это геморрой. Поэтому тут правят бал долгоживущие токены (JWT). Получил один, потом его потихоньку обновляешь, и всё.
    • Для веба: Тут браузер за тебя всё делает. Куки, сессии — родная стихия. Вошёл раз и сиди себе.
  4. Где хранить, чтобы не потерять

    • Для телефона: Кэш — это святое. Но не в оперативке, а в нормальной локальной базе (SQLite, Realm). Выключил телефон, включил — а данные-то на месте!
    • Для веба: Стандартные HTTP-заголовки (Cache-Control) и браузерный кэш рулят. Сказал "кэшируй" — браузер и кэширует.

Вот смотри, как для телефона отдаём (экономим на всём, блядь):

{
  "id": 123,
  "name": "John Doe",
  "avatarUrl": "https://cdn.example.com/avatar.jpg"
}

А вот для веба (можно и побаловать, раз уж просит):

{
  "id": 123,
  "name": "John Doe",
  "email": "john@example.com",
  "avatarUrl": "https://cdn.example.com/avatar.jpg",
  "meta": {
    "createdAt": "2023-01-15",
    "lastLogin": "2023-10-26"
  }
}

Короче, проектируй с умом, а не с одного хуя. Иначе получится единый API, который для веба — голодный, а для мобилы — неподъёмный. И все будут недовольны, как сука на сковородке.