Как вы понимаете REST?csharp-5

REST (Representational State Transfer) — это архитектурный стиль для построения распределенных систем, прежде всего веб-сервисов. Это не протокол и не стандарт, а набор принципов и ограничений, которые делают API масштабируемыми, простыми в поддержке и независимыми от клиентских технологий.

6 ключевых принципов REST

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

    • Ресурсы идентифицируются URI
    • Использование стандартных HTTP-методов
    • Самодостаточные сообщения
    • Гипермедиа как движок состояния приложения (HATEOAS)
  2. Клиент-серверная архитектура

    • Четкое разделение обязанностей
    • Сервер предоставляет данные, клиент их отображает
  3. Отсутствие состояния (Stateless)

    • Каждый запрос содержит всю необходимую информацию
    • Сервер не хранит состояние клиента между запросами
  4. Кэширование (Cacheable)

    • Ответы должны явно указывать возможность кэширования
    • Уменьшает нагрузку на сервер
  5. Многоуровневая система (Layered System)

    • Клиент не знает, подключен ли он напрямую к серверу или через промежуточные узлы
    • Позволяет масштабировать систему
  6. Код по требованию (Code on Demand)

    • Опциональный принцип
    • Сервер может временно расширять функциональность клиента, передавая исполняемый код

HTTP-методы в REST

GET       - Получение ресурса
POST     - Создание ресурса
PUT       - Полное обновление ресурса
PATCH    - Частичное обновление
DELETE  - Удаление ресурса
HEAD     - Получение метаданных
OPTIONS - Получение поддерживаемых методов

Пример RESTful API на C#

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet] // GET api/products
    public IActionResult GetAll() { ... }

    [HttpGet("{id}")] // GET api/products/5
    public IActionResult GetById(int id) { ... }

    [HttpPost] // POST api/products
    public IActionResult Create([FromBody] Product product) { ... }

    [HttpPut("{id}")] // PUT api/products/5
    public IActionResult Update(int id, [FromBody] Product product) { ... }

    [HttpDelete("{id}")] // DELETE api/products/5
    public IActionResult Delete(int id) { ... }
}

Коды состояния HTTP

Важная часть REST — использование соответствующих HTTP-статусов:

200 OK                      - Успешный запрос
201 Created               - Ресурс создан
204 No Content         - Успешно, но нет тела ответа
400 Bad Request      - Неверный запрос
401 Unauthorized   - Не авторизован
403 Forbidden         - Доступ запрещен
404 Not Found        - Ресурс не найден
500 Server Error    - Ошибка сервера

REST vs RPC vs SOAP

  1. REST - Ресурсо-ориентированный, использует HTTP методы
  2. RPC - Вызов методов (например, POST /deleteProduct)
  3. SOAP - Строгий протокол на основе XML

Best Practices REST API

  1. Используйте существительные во множественном числе для URI (/products)
  2. Версионируйте API (/api/v1/products)
  3. Поддерживайте фильтрацию, сортировку, пагинацию
  4. Используйте правильные коды состояния HTTP
  5. Возвращайте единообразные ответы об ошибках
  6. Документируйте API (OpenAPI/Swagger)

HATEOAS

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

{
  "id": 1,
  "name": "Product A",
  "price": 99.99,
  "_links": {
    "self": { "href": "/products/1" },
    "update": { "href": "/products/1", "method": "PUT" },
    "delete": { "href": "/products/1", "method": "DELETE" }
  }
}

Резюмируем:

REST — это архитектурный стиль для создания масштабируемых веб-сервисов, основанный на ресурсах, HTTP-методах и стандартных практиках. Правильно реализованное RESTful API интуитивно понятно, предсказуемо и легко интегрируется с различными клиентами.