Ответ
REST (Representational State Transfer) — это набор архитектурных ограничений и принципов для построения распределенных веб-сервисов. Ключевые принципы:
-
Единообразие интерфейса (Uniform Interface)
- Идентификация ресурсов: Каждый ресурс (пользователь, заказ) однозначно идентифицируется URI (например,
/api/users/123). - Манипуляция ресурсами через представления: Клиент работает с ресурсом через его представление (например, JSON). Отправляя обновленное представление, клиент изменяет ресурс.
- Самодостаточные сообщения: Каждый запрос от клиента содержит всю информацию, необходимую серверу для его обработки (метод, заголовки, тело).
- Гипермедиа как двигатель состояния приложения (HATEOAS): Ответы сервера содержат ссылки на другие доступные действия с ресурсом, что позволяет клиенту динамически обнаруживать функциональность API.
- Идентификация ресурсов: Каждый ресурс (пользователь, заказ) однозначно идентифицируется URI (например,
-
Отсутствие состояния (Stateless) Сервер не хранит состояние клиента между запросами. Сессионные данные должны храниться на стороне клиента (например, в токене) и передаваться в каждом запросе.
-
Кэшируемость (Cacheable) Ответы сервера должны явно указывать, можно ли их кэшировать и как долго (через HTTP-заголовки
Cache-Control,Expires). Это критично для производительности. -
Клиент-серверная архитектура Четкое разделение ответственности: клиент отвечает за UI и пользовательский опыт, сервер — за обработку данных, хранение и бизнес-логику.
-
Многоуровневая система (Layered System) Архитектура может состоять из нескольких уровней (балансировщики, прокси, шлюзы). Клиент не знает, взаимодействует ли он напрямую с конечным сервером или через промежуточное звено.
-
Код по требованию (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.