Введение: 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