Какие принципы RESTful архитектуры вы знаете?

«Какие принципы RESTful архитектуры вы знаете?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

REST (Representational State Transfer) — это набор архитектурных ограничений и принципов для построения распределенных веб-сервисов. Ключевые принципы:

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

    • Идентификация ресурсов: Каждый ресурс (пользователь, заказ) однозначно идентифицируется URI (например, /api/users/123).
    • Манипуляция ресурсами через представления: Клиент работает с ресурсом через его представление (например, JSON). Отправляя обновленное представление, клиент изменяет ресурс.
    • Самодостаточные сообщения: Каждый запрос от клиента содержит всю информацию, необходимую серверу для его обработки (метод, заголовки, тело).
    • Гипермедиа как двигатель состояния приложения (HATEOAS): Ответы сервера содержат ссылки на другие доступные действия с ресурсом, что позволяет клиенту динамически обнаруживать функциональность API.
  2. Отсутствие состояния (Stateless) Сервер не хранит состояние клиента между запросами. Сессионные данные должны храниться на стороне клиента (например, в токене) и передаваться в каждом запросе.

  3. Кэшируемость (Cacheable) Ответы сервера должны явно указывать, можно ли их кэшировать и как долго (через HTTP-заголовки Cache-Control, Expires). Это критично для производительности.

  4. Клиент-серверная архитектура Четкое разделение ответственности: клиент отвечает за UI и пользовательский опыт, сервер — за обработку данных, хранение и бизнес-логику.

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

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

Практическое применение в ASP.NET Core:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    // GET api/products — получение коллекции (Read)
    [HttpGet]
    public ActionResult<IEnumerable<Product>> Get() { ... }

    // GET api/products/5 — получение элемента (Read)
    [HttpGet("{id}")]
    public ActionResult<Product> Get(int id) { ... }

    // POST api/products — создание нового (Create)
    [HttpPost]
    public ActionResult<Product> Post([FromBody] Product product) 
    { 
        // Возвращаем код 201 Created и URI нового ресурса
        return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
    }

    // PUT api/products/5 — полное обновление (Update)
    [HttpPut("{id}")]
    public IActionResult Put(int id, [FromBody] Product product) { ... }

    // DELETE api/products/5 — удаление (Delete)
    [HttpDelete("{id}")]
    public IActionResult Delete(int id) { ... }
}

Важно: Настоящий REST подразумевает использование HATEOAS, но на практике многие публичные API следуют лишь части принципов (часто называя это "REST-like" или "RESTful"), фокусируясь на использовании HTTP-методов, статус-кодов и ресурсно-ориентированных URI.