Как написать REST API на C# за 30 минут: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: REST API на C# — это быстро и просто

Разработка современных веб-приложений и мобильных сервисов невозможна без REST API. Если вы хотите быстро создать бэкенд для своего проекта, C# с фреймворком ASP.NET Core — идеальный выбор. Благодаря встроенным инструментам, минимальной конфигурации и отличной производительности, вы можете написать полноценный REST API буквально за 30 минут.

В этой статье мы разберем процесс создания простого API для управления списком задач (Todo List). Вы узнаете, как настроить проект, создать модели данных, реализовать контроллеры с CRUD-операциями и протестировать API с помощью Swagger. Все примеры кода написаны на C# (.NET 8).

Даже если вы новичок в C#, следуя инструкциям, вы получите работающий API к концу статьи.

1. Создание проекта и настройка окружения

Первым делом убедитесь, что у вас установлен .NET SDK (версия 8 или выше). Скачать его можно с официального сайта. После установки откройте терминал или командную строку.

Создайте новый проект ASP.NET Core Web API командой:

dotnet new webapi -n TodoApi
cd TodoApi

Эта команда создаст папку TodoApi с базовой структурой проекта. В ней уже есть файл Program.cs — точка входа, и папка Controllers для будущих контроллеров.

Откройте проект в Visual Studio, Visual Studio Code или Rider. Для простоты можно использовать любой текстовый редактор.

Убедитесь, что в файле Program.cs присутствует вызов AddSwaggerGen() и UseSwagger(). Swagger автоматически включен в шаблоне — это упростит тестирование. Если его нет, добавьте:

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// ...
app.UseSwagger();
app.UseSwaggerUI();

2. Создание модели данных и временного хранилища

Для нашего API мы будем хранить задачи в оперативной памяти (in-memory). В реальном проекте вы бы подключили базу данных, но для демонстрации 30-минутного решения этого достаточно.

Создайте папку Models и внутри файл TodoItem.cs:

public class TodoItem
{
    public int Id { get; set; }
    public string Title { get; set; } = string.Empty;
    public bool IsCompleted { get; set; }
}

Теперь создадим простой сервис-репозиторий. В папке Services создайте интерфейс ITodoService.cs и его реализацию TodoService.cs. Это позволит легко переключиться на реальную БД в будущем.

ITodoService.cs:

public interface ITodoService
{
    List<TodoItem> GetAll();
    TodoItem? GetById(int id);
    TodoItem Create(TodoItem item);
    TodoItem? Update(int id, TodoItem item);
    bool Delete(int id);
}

TodoService.cs:

public class TodoService : ITodoService
{
    private readonly List<TodoItem> _items = new();
    private int _nextId = 1;

    public List<TodoItem> GetAll() => _items;

    public TodoItem? GetById(int id) => _items.FirstOrDefault(i => i.Id == id);

    public TodoItem Create(TodoItem item)
    {
        item.Id = _nextId++;
        _items.Add(item);
        return item;
    }

    public TodoItem? Update(int id, TodoItem item)
    {
        var existing = GetById(id);
        if (existing == null) return null;
        existing.Title = item.Title;
        existing.IsCompleted = item.IsCompleted;
        return existing;
    }

    public bool Delete(int id)
    {
        var item = GetById(id);
        if (item == null) return false;
        return _items.Remove(item);
    }
}

Зарегистрируйте сервис в контейнере DI в Program.cs:

builder.Services.AddSingleton<ITodoService, TodoService>();

3. Реализация контроллера с CRUD-операциями

Теперь самое главное — контроллер. Удалите стандартный файл WeatherForecastController.cs (если он есть) и создайте новый TodoController.cs в папке Controllers.

[ApiController]
[Route("api/[controller]")]
public class TodoController : ControllerBase
{
    private readonly ITodoService _service;

    public TodoController(ITodoService service)
    {
        _service = service;
    }

    // GET: api/todo
    [HttpGet]
    public ActionResult<List<TodoItem>> GetAll()
    {
        return Ok(_service.GetAll());
    }

    // GET: api/todo/{id}
    [HttpGet("{id}")]
    public ActionResult<TodoItem> GetById(int id)
    {
        var item = _service.GetById(id);
        if (item == null)
            return NotFound();
        return Ok(item);
    }

    // POST: api/todo
    [HttpPost]
    public ActionResult<TodoItem> Create(TodoItem item)
    {
        var created = _service.Create(item);
        return CreatedAtAction(nameof(GetById), new { id = created.Id }, created);
    }

    // PUT: api/todo/{id}
    [HttpPut("{id}")]
    public ActionResult<TodoItem> Update(int id, TodoItem item)
    {
        var updated = _service.Update(id, item);
        if (updated == null)
            return NotFound();
        return Ok(updated);
    }

    // DELETE: api/todo/{id}
    [HttpDelete("{id}")]
    public ActionResult Delete(int id)
    {
        var deleted = _service.Delete(id);
        if (!deleted)
            return NotFound();
        return NoContent();
    }
}

Обратите внимание на атрибуты:

  • [ApiController] — включает автоматическую валидацию модели и другие удобства.
  • [Route("api/[controller]")] — задает базовый URL (в нашем случае /api/todo).
  • [HttpGet], [HttpPost], [HttpPut], [HttpDelete] — определяют HTTP методы и маршруты.

Метод CreatedAtAction в POST возвращает статус 201 и ссылку на созданный ресурс — это соответствует лучшим практикам REST.

4. Запуск и тестирование API через Swagger

Вернитесь в терминал и выполните команду:

dotnet                

Блоги

Рекомендаций по книгам