Sobes.tech
Назад к вопросам
Junior — Middle
61

Можете ли вы описать ключевые характеристики RESTful API и чем они отличаются от других способов взаимодействия с сервисами?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

RESTful API — это подход к построению веб-сервисов вокруг ресурсов и стандартных HTTP-методов. Важно показать понимание stateless-взаимодействия, использования URL для идентификации ресурсов и предсказуемости API. Также полезно уметь сравнить REST с RPC, SOAP или просто «произвольными» HTTP-эндпоинтами.

Определение:

RESTful API — это API, которое следует принципам REST: ресурсы представлены через URL, операции над ними выполняются стандартными HTTP-методами, а каждый запрос содержит всё необходимое для обработки без хранения сервером состояния клиента между запросами.

Ключевые характеристики:

  • ресурсный подход: /users/42, /orders/1001;
  • использование HTTP-методов по назначению: GET, POST, PUT, PATCH, DELETE;
  • stateless: сервер не обязан помнить контекст предыдущих запросов;
  • единообразные ответы и коды статуса HTTP;
  • обычно используется JSON как формат данных, хотя это не обязательное требование REST.

От других способов взаимодействия REST отличается тем, что делает акцент не на вызове конкретной функции, а на работе с ресурсами. Например, в RPC чаще описывают «сделай действие», а в REST — «прочитай/измени/удали ресурс».

Пример использования:

Например, в сервисе управления пользователями можно сделать такие эндпоинты:

GET /api/users
GET /api/users/42
POST /api/users
PUT /api/users/42
DELETE /api/users/42
  • GET /api/users/42 возвращает пользователя с id 42;
  • POST /api/users создаёт нового пользователя;
  • PUT /api/users/42 обновляет пользователя;
  • DELETE /api/users/42 удаляет пользователя.

В C# это обычно выглядит как контроллер ASP.NET Core:

[ApiController]
[Route("api/users")]
public class UsersController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult GetById(int id)
    {
        return Ok(new { Id = id, Name = "Alex" });
    }

    [HttpPost]
    public IActionResult Create([FromBody] UserCreateRequest request)
    {
        return Created($"/api/users/123", new { Id = 123, request.Name });
    }
}

public class UserCreateRequest
{
    public string Name { get; set; } = string.Empty;
}

Пояснение кода:

[ApiController] включает удобное поведение для web API, включая автоматическую обработку ошибок валидации.
[Route("api/users")] задаёт базовый путь для ресурса users.
[HttpGet("{id}")] связывает метод с запросом GET /api/users/{id} и получает id из URL.
[HttpPost] обрабатывает создание ресурса через POST /api/users.
Created(...) возвращает код 201 Created, что соответствует успешному созданию ресурса.

Этот пример показывает REST-подход: URL описывает ресурс, а HTTP-метод — действие над ним. В отличие от RPC-подхода, где мог бы быть метод вроде /api/users/getById, здесь интерфейс ближе к естественной модели работы с сущностями.

Ключевые моменты:

  • REST строится вокруг ресурсов, а не вокруг «операций».
  • HTTP-методы имеют стандартный смысл и не должны использоваться произвольно.
  • Stateless-архитектура упрощает масштабирование и снижает связанность.
  • Важны корректные HTTP-коды: 200, 201, 400, 404, 500 и т.д.
  • REST удобен для публичных и внутренних API, но не всегда идеален для сложных сценариев с множеством команд и нестандартной логикой.
  • Главное отличие от RPC/SOAP — более универсальный и предсказуемый контракт через стандарт HTTP.