Каковы основные преимущества и недостатки REST API?

Ответ

Преимущества REST:

  1. Простота и стандартизация: Использует хорошо известные HTTP-методы (GET, POST, PUT, DELETE, PATCH) и коды состояния.
  2. Stateless-архитектура: Каждый запрос содержит всю необходимую информацию, что упрощает масштабирование и повышает надежность.
  3. Кэшируемость: Ответы могут быть закэшированы на стороне клиента или промежуточных прокси, используя стандартные HTTP-заголовки (Cache-Control, ETag).
  4. Гибкость данных: Поддерживает различные форматы (JSON, XML), где JSON стал де-факто стандартом для веб-API.
  5. Разделение клиента и сервера: Позволяет независимо развивать фронтенд и бэкенд.

Недостатки REST:

  1. Проблемы с эффективностью данных:
    • Over-fetching: Клиент получает больше данных, чем ему нужно.
    • Under-fetching: Для построения одного представления может потребоваться несколько запросов к разным эндпоинтам.
  2. Отсутствие строгой спецификации: Нет единого стандарта на структуру URL, версионирование или документацию, что может привести к неконсистентным API.
  3. Сложность для реального времени: Не поддерживает двунаправленную коммуникацию «из коробки» (для этого нужны WebSockets или Server-Sent Events).

Пример типичного REST-запроса и ответа:

GET /api/v1/users/42 HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer <token>
{
  "id": 42,
  "name": "John Doe",
  "email": "john@example.com",
  "created_at": "2023-01-15T10:30:00Z"
}

Ответ 18+ 🔞

Слушай, ну вот смотри, все эти ваши модные штуки типа GraphQL, gRPC, а REST всё ещё тут, как этот старый, проверенный диван в бабушкиной гостиной. Удобный, привычный, но иногда пружины в жопу упираются, блядь.

Плюсы, или почему его до сих пор не выкинули на свалку:

  1. Простота, что твой тапок. Все знают, что GET — это достать, POST — запихнуть, DELETE — выкинуть нахуй. Никакой магии, всё на стандартных HTTP-методах. Даже джуниор, если не совсем мудак, разберётся.
  2. Stateless, или «ничего не помню, иди сам всё неси». Каждый запрос самодостаточен, как кот. Серверу похуй, кто ты и что делал до этого. Это, с одной стороны, офигенно для масштабирования — можно набросать кучу серверов, и они не будут друг другу мозги ебать. С другой — всю авторизацию и контекст таскаешь с собой, как чемодан без ручки.
  3. Кэширование — святое дело. Настроил заголовки Cache-Control, и браузер или прокси сами всё запомнят. Экономия трафика — просто ебушки-воробушки. Не надо каждый раз дергать сервер за яйца.
  4. Данные любые, жри что дают. В основном, конечно, JSON, этот всеми любимый формат. Лёгкий, человекочитаемый. Можно и XML, но это уже для мазохистов старой закалки.
  5. Клиент с сервером разведены, как в хорошем бракоразводном процессе. Фронтенд может на React'е прыгать, а бэкенд на Go сидеть — им похуй друг на друга, лишь бы API-контракт соблюдали. Независимость развития — красота.

Минусы, или где пружины от дивана вылезают:

  1. Проблемы с данными — просто пиздец.
    • Over-fetching: Запросил имя пользователя, а тебе в ответ прилетела вся его биография, дата рождения, любимый цвет и размер трусов. Ты это не спрашивал, но сервер, такой щедрый, нахуярил всего. Трафик зря жрёшь.
    • Under-fetching: А бывает наоборот. Чтобы собрать страницу профиля, тебе надо сделать запрос за пользователем, потом за его постами, потом за аватаркой, потом за друзьями... Десять запросов, ебать мои старые костыли! Хочется один жирный запрос, а получаешь кучу мелких.
  2. Спецификации нет, как нет и совести. Все делают REST, как бог на душу положит. Одни версионируют в URL (/api/v2/), другие в заголовках. Документация — либо шикарный Swagger, либо записка на салфетке «спроси у Васька». Консистентности — ноль ебать.
  3. Для реального времени не годится. Хочешь чат или уведомления, чтобы данные сами лились на клиент? Забудь. REST для этого не приспособлен, придётся рядом ставить WebSockets или SSE, и получается архитектурный винегрет.

Ну и пример, как это обычно выглядит: Ты, такой красавчик, стучишься к серверу:

GET /api/v1/users/42 HTTP/1.1
Host: api.example.com
Accept: application/json
Authorization: Bearer <token>

А сервер тебе, такой добрый, вываливает:

{
  "id": 42,
  "name": "John Doe",
  "email": "john@example.com",
  "created_at": "2023-01-15T10:30:00Z"
}

Всё чинно, благородно. Но внутри ты уже думаешь: «А зачем мне created_at? И где, блядь, его аватарка? Придётся ещё запрос делать...». Вот такая, блядь, палка о двух концах.