# RESTful принципы

## 1. Клиент-серверная модель (client-server model)

Клиент и сервер могут работать абсолютно независимо друг от друга. Разработчики используют достаточно простой способ организации REST API: клиентский код остается на его стороне, а код доступа — на сервере. Если клиентский код изменится, это не скажется на работе сервера, и наоборот. Благодаря этому REST API имеет такие преимущества, как переносимость и гибкость, а также возможность масштабирования.

## 2. Отсутствие состояния (statelessness)

На сервере не записываются проведенные операции клиента. Каждый запрос должен быть информативным и унифицированным, то есть понятным серверу.

## 3. Кэширование (cacheability)

В REST API запросах определяется, нужно ли кэшировать данные в буфере. Клиенту это дает высокую производительность и увеличивает скорость загрузки страниц, а серверу дает большие возможности масштабирования.

## 4. Единообразие интерфейса (uniform interface)

Одним из важнейших аспектов проектирования RESTful API является соблюдение единого интерфейса. Это предполагает использование согласованных соглашений и стандартных методов HTTP для обработки запросов API. Соответствуя этим стандартам, разработчики могут значительно упростить внедрение и обслуживание API. API REST должны использовать следующие стандартные методы HTTP для различных действий:

* `GET` : извлекает ресурс или коллекцию ресурсов.
* `POST` : Создает новый ресурс или отправляет данные для обработки.
* `PUT` : полностью обновляет существующий ресурс, заменяя его новыми данными.
* `PATCH` : Частично обновляет ресурс с определенными изменениями.
* `DELETE` : Удаляет ресурс.

Эти стандартные методы четко понимают каждую операцию и способствуют совместимости между клиентами и серверами. Для обеспечения надежной и последовательной работы крайне важно обеспечить правильный метод для каждого действия. Более того, единый интерфейс упрощает обработку ошибок и кодов состояния, гарантируя клиентам четкую и последовательную обратную связь. При создании RESTful API крайне важно возвращать точные и информативные коды состояния HTTP.  [Статусов много](https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BA%D0%BE%D0%B4%D0%BE%D0%B2_%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F_HTTP), поэтому их всех не перечислить, однако важно знать их группировку::

* **2xx – Успех:** запрос был успешно получен, понят и принят.
* **3xx — Перенаправление (редирект):** запрос должен выполнить дальнейшие действия для завершения запроса.
* **4xx — Ошибка клиента:** запрос имеет неверный синтаксис или не может быть выполнен.
* **5xx — Ошибка сервера:** серверу не удалось выполнить кажущийся действительным запрос.

## 5. Многоуровневая система (layered system)

В RESTful возможна группировка серверов на разных уровнях, каждый из которых выполняет определенный функционал и выступает посредником между клиентом и сервером.

## 6. Код по требованию (code on demand) — необязательно

Серверы предоставляют клиенту статические представления ресурсов. При использовании программной архитектуры REST API клиент, к примеру, может получить код рендеринга для виджетов. Общий код усложняется лишь при необходимости.

Источники:

* <https://gb.ru/blog/rest-api/>&#x20;
* <https://appmaster.io/ru/blog/shest-pravil-otdykha-apis> (подробнее)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.system-analyst-base.ru/hard-skills/integracii/vidy-integracii/sinkhronnoe-vzaimodeistvie/rest/restful-principy.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
