Как написать REST API на C# за 30 минут: для начинающих

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

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

Начать курс

Введение: REST API на C# — это проще, чем кажется

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

В этом руководстве мы шаг за шагом создадим простое API для управления списком задач (Todo List). Вы узнаете, как настроить проект, создать модель данных, контроллер и протестировать эндпоинты. Никакой магии — только чистый код и понятные объяснения.

К концу статьи у вас будет полностью функционирующий API, поддерживающий все основные CRUD-операции (Create, Read, Update, Delete).

Шаг 1: Подготовка окружения и создание проекта

Прежде чем писать код, убедитесь, что у вас установлены необходимые инструменты:

  • .NET SDK (версия 8.0 или новее) — скачать с официального сайта Microsoft
  • Visual Studio (2022 Community Edition) или Visual Studio Code с расширением C#
  • Postman или любой другой REST-клиент для тестирования

Откройте терминал (или командную строку) и выполните следующую команду для создания нового проекта Web API:

dotnet new webapi -n TodoApi
cd TodoApi

После создания проекта откройте папку TodoApi в вашей IDE. Структура проекта будет содержать несколько папок и файлов, но нас пока интересуют три ключевых: Program.cs, Controllers и Models.

Шаг 2: Создание модели данных

Модель — это класс, который описывает структуру данных нашего API. Для списка задач нам понадобятся три поля: уникальный идентификатор, название и статус выполнения.

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

namespace TodoApi.Models;

public class TodoItem
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
}

Обратите внимание на вопросительный знак после string. Он указывает, что свойство Name может быть null. Это хорошая практика для избежания предупреждений компилятора.

Шаг 3: Создание контроллера и реализация CRUD

Контроллер — это класс, который обрабатывает HTTP-запросы. В ASP.NET Core контроллеры наследуются от ControllerBase и используют атрибуты для маршрутизации.

Создайте файл TodoItemsController.cs в папке Controllers:

using Microsoft.AspNetCore.Mvc;
using TodoApi.Models;

namespace TodoApi.Controllers;

[ApiController]
[Route("api/[controller]")]
public class TodoItemsController : ControllerBase
{
    private static List<TodoItem> _todoItems = new();

    // GET: api/TodoItems
    [HttpGet]
    public ActionResult<IEnumerable<TodoItem>> GetTodoItems()
    {
        return _todoItems;
    }

    // GET: api/TodoItems/1
    [HttpGet("{id}")]
    public ActionResult<TodoItem> GetTodoItem(int id)
    {
        var item = _todoItems.FirstOrDefault(t => t.Id == id);
        if (item == null)
            return NotFound();
        return item;
    }

    // POST: api/TodoItems
    [HttpPost]
    public ActionResult<TodoItem> PostTodoItem(TodoItem item)
    {
        item.Id = _todoItems.Count + 1;
        _todoItems.Add(item);
        return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item);
    }

    // PUT: api/TodoItems/1
    [HttpPut("{id}")]
    public IActionResult PutTodoItem(int id, TodoItem updatedItem)
    {
        var existingItem = _todoItems.FirstOrDefault(t => t.Id == id);
        if (existingItem == null)
            return NotFound();

        existingItem.Name = updatedItem.Name;
        existingItem.IsComplete = updatedItem.IsComplete;
        return NoContent();
    }

    // DELETE: api/TodoItems/1
    [HttpDelete("{id}")]
    public IActionResult DeleteTodoItem(int id)
    {
        var item = _todoItems.FirstOrDefault(t => t.Id == id);
        if (item == null)
            return NotFound();

        _todoItems.Remove(item);
        return NoContent();
    }
}

Давайте разберем, что здесь происходит:

  • [ApiController] — включает автоматическую валидацию моделей и другие удобные функции
  • [Route("api/[controller]")] — задает базовый URL: /api/TodoItems
  • Мы используем временное хранилище в виде статического списка. В реальном проекте вы бы подключили базу данных
  • Каждый HTTP-метод (GET, POST, PUT, DELETE) обрабатывается отдельным методом контроллера
  • CreatedAtAction возвращает код 201 и URL только что созданного ресурса

Шаг 4: Настройка Program.cs и запуск

Откройте файл Program.cs. В современных версиях .NET (8+) он выглядит лаконично. Убедитесь, что он содержит следующие строки:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.MapControllers();

app.Run();

Эти строки подключают контроллеры и настраивают маршрутизацию. Теперь запустите приложение:

dotnet run

Вы увидите сообщение, что сервер запущен на http://localhost:5000 и, возможно, https://localhost:5001.

Шаг 5: Тестирование API с помощью Postman

Откройте Postman и выполните следующие запросы:

Создание задачи (POST)

Метод: POST
URL: http://localhost:5000/api/TodoItems
Тело (JSON):

{
    "name": "Изучить C#",
    "isComplete": false
}

В ответ вы получите статус 201 Created и созданную задачу с присвоенным ID.

Получение всех задач (GET)

Блоги

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