Ответ
REST (Representational State Transfer) — это набор архитектурных ограничений и принципов для проектирования распределенных систем. Его ядро составляют шесть принципов:
-
Единообразие интерфейса (Uniform Interface): Упрощает архитектуру, отделяя клиент от сервера. Включает:
- Идентификация ресурсов в запросах: Каждый ресурс (пользователь, заказ) идентифицируется уникальным URI (например,
/api/users/123). - Манипуляция ресурсами через представления: Клиент работает с ресурсом через его представление (например, JSON). Обновив представление на сервере, клиент изменяет ресурс.
- Самодостаточные сообщения: Каждый запрос содержит всю информацию, необходимую для его обработки.
- Гипермедиа как двигатель состояния приложения (HATEOAS): Ответы сервера содержат ссылки на возможные следующие действия, что позволяет клиенту динамически обнаруживать функциональность.
- Идентификация ресурсов в запросах: Каждый ресурс (пользователь, заказ) идентифицируется уникальным URI (например,
-
Отсутствие состояния (Stateless): Сервер не хранит состояние клиента между запросами. Все необходимое состояние (например, токен аутентификации, контекст) передается в каждом запросе через заголовки, URI или тело.
-
Кэшируемость (Cacheable): Ответы сервера должны явно указывать, можно ли их кэшировать и как долго. Это критически важно для производительности.
-
Клиент-серверная архитектура: Четкое разделение ответственности: клиент отвечает за UI и пользовательский опыт, сервер — за обработку данных, хранение и бизнес-логику.
-
Многоуровневая система (Layered System): Архитектура может состоять из нескольких уровней (балансировщик, сервер приложений, база данных). Клиент не знает, с каким конкретно уровнем он взаимодействует, что повышает масштабируемость и безопасность.
-
Код по требованию (Code on Demand, опционально): Сервер может временно расширять функциональность клиента, передавая исполняемый код (например, JavaScript).
Пример RESTful запроса на C#:
using var httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://api.example.com");
// GET для получения ресурса
var userResponse = await httpClient.GetAsync("/users/1");
userResponse.EnsureSuccessStatusCode();
var userJson = await userResponse.Content.ReadAsStringAsync();
// Десериализация userJson в объект User
// PUT для обновления ресурса
var updatedUser = new { name = "New Name" };
var jsonContent = new StringContent(JsonSerializer.Serialize(updatedUser), Encoding.UTF8, "application/json");
var updateResponse = await httpClient.PutAsync("/users/1", jsonContent);
Практический итог: REST — это не протокол, а стиль, который использует HTTP как транспорт, а ресурсы, представления и стандартные методы (GET, POST, PUT, DELETE, PATCH) — как его основу.