← Назад к вопросам

Что такое REST в ASP.NET?

1.0 Junior🔥 211 комментариев
#ASP.NET и Web API

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое REST в ASP.NET?

REST (Representational State Transfer) — это архитектурный стиль для проектирования веб-APIs, основанный на HTTP протоколе. В ASP.NET REST реализуется через контроллеры и эндпоинты.

Основные принципы REST

  1. Ресурсы как существительные — /users, /products, не /getUsers
  2. HTTP методы для действий — GET (получить), POST (создать), PUT (обновить), DELETE (удалить)
  3. Stateless — каждый запрос содержит всю нужную информацию
  4. JSON представление — данные обмениваются в JSON формате

REST в ASP.NET — WebAPI контроллер

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    // GET: /api/users — получить всех пользователей
    [HttpGet]
    public IActionResult GetAll()
    {
        var users = new[] { new { Id = 1, Name = "Alice" } };
        return Ok(users);
    }
    
    // GET: /api/users/1 — получить пользователя по ID
    [HttpGet("{id}")]
    public IActionResult GetById(int id)
    {
        return Ok(new { Id = id, Name = "Alice" });
    }
    
    // POST: /api/users — создать нового пользователя
    [HttpPost]
    public IActionResult Create([FromBody] CreateUserDto dto)
    {
        return CreatedAtAction(nameof(GetById), new { id = 1 }, new { Id = 1, Name = dto.Name });
    }
    
    // PUT: /api/users/1 — обновить пользователя
    [HttpPut("{id}")]
    public IActionResult Update(int id, [FromBody] UpdateUserDto dto)
    {
        return Ok(new { Id = id, Name = dto.Name });
    }
    
    // DELETE: /api/users/1 — удалить пользователя
    [HttpDelete("{id}")]
    public IActionResult Delete(int id)
    {
        return NoContent();
    }
}

HTTP методы и статус коды

// GET — безопасный, идемпотентный (не изменяет состояние)
[HttpGet]
public IActionResult GetUsers() => Ok(_users);

// POST — создание нового ресурса
[HttpPost]
public IActionResult CreateUser([FromBody] UserDto dto)
{
    var newUser = new User { Id = ++_lastId, ...dto };
    return CreatedAtAction(nameof(GetUser), new { id = newUser.Id }, newUser);
    // Возвращает 201 Created с Location header
}

// PUT — полное обновление (замена) ресурса
[HttpPut("{id}")]
public IActionResult UpdateUser(int id, [FromBody] UserDto dto)
{
    var user = _users.Find(u => u.Id == id);
    user.Name = dto.Name;
    return Ok(user);  // 200 OK
}

// PATCH — частичное обновление (если поддерживается)
[HttpPatch("{id}")]
public IActionResult PartialUpdate(int id, [FromBody] JsonPatchDocument<UserDto> patch)
{
    // обновляем только переданные поля
    return Ok();
}

// DELETE — удаление ресурса
[HttpDelete("{id}")]
public IActionResult DeleteUser(int id)
{
    _users.Remove(_users.Find(u => u.Id == id));
    return NoContent();  // 204 No Content
}

REST запросы

# GET (получить список)
GET /api/users
Response: 200 OK
{
  [{ "id": 1, "name": "Alice" }, { "id": 2, "name": "Bob" }]
}

# GET (получить один)
GET /api/users/1
Response: 200 OK
{ "id": 1, "name": "Alice" }

# POST (создать)
POST /api/users
Body: { "name": "Charlie" }
Response: 201 Created
Location: /api/users/3
{ "id": 3, "name": "Charlie" }

# PUT (обновить)
PUT /api/users/1
Body: { "name": "Alexandra" }
Response: 200 OK
{ "id": 1, "name": "Alexandra" }

# DELETE (удалить)
DELETE /api/users/1
Response: 204 No Content

Routing в ASP.NET

[ApiController]
[Route("api/v1/[controller]")]  // /api/v1/users
public class UsersController : ControllerBase
{
    [HttpGet]  // GET /api/v1/users
    public IActionResult GetAll() { }
    
    [HttpGet("{id}")]  // GET /api/v1/users/1
    public IActionResult GetById(int id) { }
    
    [HttpPost]  // POST /api/v1/users
    public IActionResult Create([FromBody] UserDto dto) { }
}

Response DTO

public class UserDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> GetUser(int id)
{
    var user = await _db.Users.FindAsync(id);
    if (user == null)
        return NotFound();  // 404
    
    return Ok(new UserDto { Id = user.Id, Name = user.Name, Email = user.Email });
}

Async/Await в REST APIs

[HttpGet("{id}")]
public async Task<ActionResult<UserDto>> GetUserAsync(int id)
{
    var user = await _db.Users.FirstOrDefaultAsync(u => u.Id == id);
    return Ok(user);
}

Итог

REST в ASP.NET — это создание HTTP APIs с использованием стандартных методов (GET, POST, PUT, DELETE) и правильных HTTP статус кодов. Это делает API предсказуемым и удобным для фронтенда и других клиентов.