Ответ
Хотя мобильные и веб-клиенты могут использовать один и тот же backend API, их требования к нему часто различаются из-за особенностей платформ.
Основные различия в проектировании API
-
Оптимизация данных и трафика
- Мобильное API: Часто возвращает только необходимые поля (например, используя GraphQL или параметры типа
?fields=id,name). Это экономит трафик, время загрузки и заряд батареи. - Веб-API: Может позволять себе возвращать более полные объекты с дополнительной мета-информацией, так как веб-соединение обычно стабильнее.
- Мобильное API: Часто возвращает только необходимые поля (например, используя GraphQL или параметры типа
-
Управление версиями и обратная совместимость
- Мобильное API: Требует строгого контроля версий (например,
/v2/users). Пользователи не всегда сразу обновляют приложение, поэтому старые версии API должны поддерживаться дольше. - Веб-API: Обновление происходит мгновенно с обновлением страницы, поэтому можно чаще вносить обратно-совместимые изменения.
- Мобильное API: Требует строгого контроля версий (например,
-
Авторизация и аутентификация
- Мобильное API: Чаще используют долгоживущие токены доступа (JWT) и механизм refresh-токенов, так как управление сессиями и куками на мобильных устройствах менее надежно.
- Веб-API: Чаще полагаются на сессии и куки, управляемые браузером.
-
Кэширование
- Мобильное 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, блядь! Сидишь, думаешь, ну один бэкенд, один код — и всем хорошо, да? Как бы не так, ёпта! Мобилка и веб — это как два разных зверя, один в тапке сидит, а другой по джунглям скачет. И кормить их надо по-разному, иначе один сожрёт всё и обосрётся, а второй сдохнет с голоду.
Так, блядь, в чём же разница, спросишь ты?
-
Про трафик и батарейку, ебать мои старые костыли
- Для телефона: Тут, сука, каждый байт на счету. Батарейка садится, связь хромает. Поэтому API должно отдавать только самое нужное, как будто ты в походе и считаешь каждую крошку. GraphQL или
?fields=id,name— вот твои лучшие друзья. - Для веба: Ну тут-то что? Розетка рядом, вайфай стабильный. Можно и полный объект с метаданными отправить, пусть браузер думает. Жирно не будет.
- Для телефона: Тут, сука, каждый байт на счету. Батарейка садится, связь хромает. Поэтому API должно отдавать только самое нужное, как будто ты в походе и считаешь каждую крошку. GraphQL или
-
Версии, или "Почему мой старый айфон всё ещё должен работать"
- Для телефона: Тут пиздец, чувак. Люди годами не обновляют приложения! Поэтому версии API (
/v2/users) — это святое. Старый код должен жить, пока последний юзер с кнопочной звонилкой не откинется. - Для веба: Обновил сервер — у всех всё сразу новое. Страница перезагрузилась и поехала. Можно потихоньку менять, главное — не сломать обратно.
- Для телефона: Тут пиздец, чувак. Люди годами не обновляют приложения! Поэтому версии API (
-
Кто ты такой, и на каком основании?
- Для телефона: Сессии с куками — это геморрой. Поэтому тут правят бал долгоживущие токены (JWT). Получил один, потом его потихоньку обновляешь, и всё.
- Для веба: Тут браузер за тебя всё делает. Куки, сессии — родная стихия. Вошёл раз и сиди себе.
-
Где хранить, чтобы не потерять
- Для телефона: Кэш — это святое. Но не в оперативке, а в нормальной локальной базе (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, который для веба — голодный, а для мобилы — неподъёмный. И все будут недовольны, как сука на сковородке.