Что подразумевает принцип единообразия интерфейса (Uniform Interface) в REST

Ответ

Единообразие интерфейса (Uniform Interface) — одно из шести ключевых архитектурных ограничений REST, которое стандартизирует и упрощает взаимодействие между клиентом и сервером. Оно состоит из четырех составляющих:

  1. Идентификация ресурсов (Identification of resources): Каждый ресурс однозначно идентифицируется с помощью URI (Uniform Resource Identifier). Например, /users/123 — это URI для конкретного пользователя.

  2. Манипуляция ресурсами через представления (Manipulation of resources through representations): Клиент взаимодействует с ресурсом через его представление (например, в формате JSON или XML). Ответ сервера содержит достаточно информации, чтобы клиент мог изменить или удалить ресурс на сервере.

  3. Самодостаточные сообщения (Self-descriptive messages): Каждое сообщение (запрос или ответ) содержит всю необходимую информацию для его обработки. Это включает HTTP-метод (GET, POST), заголовки (например, Content-Type) и тело сообщения.

  4. Гипермедиа как двигатель состояния приложения (HATEOAS): Ответы сервера содержат ссылки (гипермедиа), которые позволяют клиенту динамически обнаруживать доступные действия и переходить между состояниями приложения. Это снижает связанность клиента и сервера.

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

// GET /users/123
{
  "id": 123,
  "name": "Alex",
  "links": [
    {
      "rel": "self",
      "href": "/users/123",
      "method": "GET"
    },
    {
      "rel": "edit",
      "href": "/users/123",
      "method": "PUT"
    },
    {
      "rel": "orders",
      "href": "/users/123/orders",
      "method": "GET"
    }
  ]
}

Соблюдение этого принципа позволяет клиенту и серверу развиваться независимо друг от друга.

Ответ 18+ 🔞

Да ты послушай, что они придумали, блядь! Единообразие интерфейса в REST. Звучит как какая-то хуйня из учебника, а на деле — просто гениальная попытка заставить всех не изобретать велосипед на каждом углу.

Смотри, суть-то проще пареной репы, если отбросить эту ёбаную наукообразность. Представь, ты заходишь в бар. Ты — клиент, бар — сервер.

  1. Идентификация ресурсов. Ты не орешь: «Эй, дай мне ту штуку, которая булькает и с персиком!». Ты говоришь четко: «Дайте коктейль /menu/cocktails/piña-colada». У каждой позиции в баре — свой уникальный номер, свой URI. Хочешь пользователя? Вот тебе /users/123. Всё, пиздец, никакой двусмысленности.

  2. Манипуляция через представления. Тебе не приносят сам бокал с пальмой, чтобы ты его там физически переставил. Тебе приносят чек (это представление в JSON), где написано: «Пина Колада, 500 руб., статус: не оплачен». Имея этот чек, ты можешь сказать: «Нахуй эту цену, делайте 300» (это PUT-запрос с новым JSON) или «Отменяю заказ» (DELETE). Ты работаешь не с самой сущностью, а с её описанием. Умно, блядь!

  3. Самодостаточные сообщения. Твой запрос — не набор загадочных стуков. Это полноценное письмо. В конверте (заголовках) написано: «Язык — русский, хочу получить ответ в формате JSON, метод — GET». А внутри уже сама просьба. Серверу не надо лезть в память и вспоминать, кто ты такой и что ты в прошлый раз просил. Всё — прямо здесь, в рот меня чих-пых! Нет телепатии, только чёткие инструкции.

  4. А вот это, блядь, верх наглости и гениальности — HATEOAS. Гипермедиа как двигатель состояния. Это когда тебе в ответе не просто дают данные, а ещё и нахуячивают ссылок, что делать дальше. Как в квесте!

Вот смотри на этот пример, он огонь:

// GET /users/123
{
  "id": 123,
  "name": "Alex",
  "links": [
    {
      "rel": "self",
      "href": "/users/123",
      "method": "GET"
    },
    {
      "rel": "edit",
      "href": "/users/123",
      "method": "PUT"
    },
    {
      "rel": "orders",
      "href": "/users/123/orders",
      "method": "GET"
    }
  ]
}

Клиент смотрит на это и понимает: «О, ёпта! У этого Алекса есть заказы! И я знаю точный адрес, чтобы их получить! А ещё я знаю, как его отредактировать!». Клиент не должен догадываться или хардкодить пути. Он просто тыкает в готовые ссылки, которые сервер ему подсунул. Сервер меняет пути — и хуй с ним, клиент всё равно попадёт куда надо по свежим ссылкам. Связанность — ноль ебать!

Вот и весь принцип. Не договорённости на салфетках, а единый протокол для всех. Клиент и сервер могут эволюционировать отдельно, не превращаясь в монолитного пидораса, который сломается от любого чиха. Красота, да и только.