Каковы ключевые принципы архитектурного стиля REST?

Ответ

REST (Representational State Transfer) — это архитектурный стиль для построения распределённых систем, основанный на стандартах HTTP. Его ключевые принципы:

  1. Единообразие интерфейса (Uniform Interface):

    • Использование ресурсов (идентифицируемых URI).
    • Представления ресурсов (например, JSON, XML).
    • Самоописываемые сообщения (использование HTTP-методов и заголовков).
    • HATEOAS (Hypermedia as the Engine of Application State) — клиент взаимодействует с приложением через гиперссылки, предоставляемые сервером.
  2. Отсутствие состояния (Stateless): Каждый запрос от клиента должен содержать всю информацию, необходимую серверу для его обработки. Сервер не хранит состояние сессии клиента.

  3. Кэшируемость (Cacheable): Ответы сервера должны явно указывать, можно ли их кэшировать, чтобы повысить производительность.

  4. Клиент-серверная архитектура: Чёткое разделение обязанностей позволяет им развиваться независимо.

  5. Слоистая система (Layered System): Архитектура может состоять из нескольких слоёв (прокси, балансировщики, шлюзы), что повышает масштабируемость и безопасность.

  6. Код по требованию (Code on Demand, опционально): Сервер может временно расширять функциональность клиента, передавая исполняемый код (например, JavaScript).

Пример REST-контроллера на Spring:

@RestController
@RequestMapping("/api/books")
public class BookController {
    @GetMapping("/{id}")
    public ResponseEntity<Book> getBook(@PathVariable Long id) {
        // GET для получения ресурса
        return ResponseEntity.ok(bookService.findById(id));
    }

    @PostMapping
    public ResponseEntity<Book> createBook(@RequestBody Book book) {
        // POST для создания ресурса
        return ResponseEntity.status(HttpStatus.CREATED)
                             .body(bookService.save(book));
    }
}

Ответ 18+ 🔞

Ага, вот этот ваш REST, архитектурный стиль, блядь... Ну, типа, свод правил, как серверу с клиентами общаться, чтобы не переругиваться, как на базаре. Представь, что это не протокол, а такой, блядь, свод неписанных законов для веба, типа как в приличном обществе не чавкать. Только тут про HTTP и ресурсы.

Смотри, основные принципы, на которых всё держится, блядь:

  1. Единый интерфейс, как у всех нормальных пацанов. Все общаются по одним и тем же правилам:

    • Всё — это ресурсы, у каждого свой адрес (URI), как прописка, блядь.
    • Ресурсы не сами по себе летают, а в представлениях (JSON, XML — кому что ближе).
    • Сообщения самоописываемые: в каждом запросе ясно написано, что хочешь (GET, POST) и что везешь (заголовки).
    • И самый крутой прикол — HATEOAS. Это когда сервер, такой хитрожопый, не просто данные отдаёт, а ещё и ссылочки подкидывает: «На, дружок, вот что можно сделать дальше». Клиент как слепой котёнок, по этим ссылкам и шастает.
  2. Без состояния, блядь (Stateless). Это святое! Каждый запрос от клиента — это как отдельная, ёпта, телеграмма с полным набором инструкций. Сервер не должен помнить, кто ты и что ты в прошлый раз просил. Никаких сессий, «а помнишь, я вчера...». Всё в одном письме. Идеально для масштабирования, потому что сервера — тупые и забывчивые, как сука, золотые рыбки.

  3. Кэшируемость. Чтобы каждый раз не дергать сервер по пустякам, ответы должны чётко говорить: «Меня, блядь, можно закэшировать на пять минут» или «Не смей кэшировать, я уникальный!». Экономия трафика и нервов — овердохуища.

  4. Клиент-сервер. Классика, хуле. Чёткое разделение: клиент — это интерфейс, рожа приложения; сервер — это мозги и данные. Меняй рожу, не трогая мозги, и наоборот. Красота.

  5. Слои, блядь. Система может быть многослойной, как торт «Наполеон». Между клиентом и сервером могут сидеть прокси, балансировщики, брандмауэры — целая толпа посредников. Клиенту похуй, он общается с первым слоем, а тот уже сам разбирается с остальными. Безопасность и масштабируемость на уровне.

  6. Код по требованию (опция). Ну, это уже для экзотики. Сервер может сказать: «Держи, чувак, вот скрипт на JavaScript, выполни его у себя». Как дать гостю свой нож, чтобы он сам себе бутерброд намазал. Редко, но бывает.

А вот, смотри, как это выглядит в коде на Spring, чтоб ты понимал, о чём речь. Это же просто, блядь:

@RestController
@RequestMapping("/api/books")
public class BookController {
    @GetMapping("/{id}")
    public ResponseEntity<Book> getBook(@PathVariable Long id) {
        // GET — это типа «Дай-ка мне, сука, книжку с таким-то ID»
        return ResponseEntity.ok(bookService.findById(id));
    }

    @PostMapping
    public ResponseEntity<Book> createBook(@RequestBody Book book) {
        // POST — это «На, засунь эту новую книжку в свою базу, я ж создал»
        return ResponseEntity.status(HttpStatus.CREATED)
                             .body(bookService.save(book));
    }
}

Вот и вся философия. Не городи огород, используй то, что уже придумано (HTTP), будь вежливым и предсказуемым. А то некоторые свои протоколы из пальца высасывают, ебать мои старые костыли...