Создание проекта
1dotnet new webapi -n MyApi2cd MyApi3dotnet run
▸Структура проекта
ASP.NET Core 8 поддерживает минимальные API для простых приложений и контроллеры для сложных.
Минимальные API
1// Program.cs2var builder = WebApplication.CreateBuilder(args);34builder.Services.AddEndpointsApiExplorer();5builder.Services.AddSwaggerGen();67var app = builder.Build();89if (app.Environment.IsDevelopment())10{11 app.UseSwagger();12 app.UseSwaggerUI();13}1415var todos = new List<TodoItem>();1617app.MapGet("/todos", () => Results.Ok(todos))18 .WithName("GetTodos")19 .WithOpenApi();2021app.MapGet("/todos/{id}", (int id) =>22{23 var todo = todos.FirstOrDefault(t => t.Id == id);24 return todo is not null ? Results.Ok(todo) : Results.NotFound();25})26 .WithName("GetTodoById");2728app.MapPost("/todos", (TodoItem item) =>29{30 item.Id = todos.Count + 1;31 todos.Add(item);32 return Results.Created($"/todos/{item.Id}", item);33})34 .WithName("CreateTodo");3536app.MapPut("/todos/{id}", (int id, TodoItem updated) =>37{38 var todo = todos.FirstOrDefault(t => t.Id == id);39 if (todo is null) return Results.NotFound();4041 todo.Title = updated.Title;42 todo.IsCompleted = updated.IsCompleted;43 return Results.Ok(todo);44})45 .WithName("UpdateTodo");4647app.MapDelete("/todos/{id}", (int id) =>48{49 var todo = todos.FirstOrDefault(t => t.Id == id);50 if (todo is null) return Results.NotFound();5152 todos.Remove(todo);53 return Results.NoContent();54})55 .WithName("DeleteTodo");5657app.Run();5859public record TodoItem60{61 public int Id { get; set; }62 public string Title { get; set; } = string.Empty;63 public bool IsCompleted { get; set; }64}
Контроллеры
1[ApiController]2[Route("api/[controller]")]3public class TodosController : ControllerBase4{5 private readonly ITodoService _service;67 public TodosController(ITodoService service)8 {9 _service = service;10 }1112 [HttpGet]13 public async Task<ActionResult<IEnumerable<TodoDto>>> GetAll()14 {15 var todos = await _service.GetAllAsync();16 return Ok(todos);17 }1819 [HttpGet("{id}")]20 public async Task<ActionResult<TodoDto>> GetById(int id)21 {22 var todo = await _service.GetByIdAsync(id);23 return todo is not null ? Ok(todo) : NotFound();24 }2526 [HttpPost]27 public async Task<ActionResult<TodoDto>> Create(CreateTodoDto dto)28 {29 var created = await _service.CreateAsync(dto);30 return CreatedAtAction(nameof(GetById), new { id = created.Id }, created);31 }3233 [HttpPut("{id}")]34 public async Task<IActionResult> Update(int id, UpdateTodoDto dto)35 {36 var result = await _service.UpdateAsync(id, dto);37 return result ? NoContent() : NotFound();38 }3940 [HttpDelete("{id}")]41 public async Task<IActionResult> Delete(int id)42 {43 var result = await _service.DeleteAsync(id);44 return result ? NoContent() : NotFound();45 }46}
Валидация
1using FluentValidation;23public class CreateTodoDtoValidator : AbstractValidator<CreateTodoDto>4{5 public CreateTodoDtoValidator()6 {7 RuleFor(x => x.Title)8 .NotEmpty().WithMessage("Title is required")9 .MaximumLength(200).WithMessage("Title too long");1011 RuleFor(x => x.Priority)12 .InclusiveBetween(1, 5);13 }14}
Автоматическая документация
1// Program.cs2builder.Services.AddSwaggerGen(c =>3{4 c.SwaggerDoc("v1", new OpenApiInfo5 {6 Title = "My API",7 Version = "v1",8 Description = "REST API for Todo application"9 });10});
Обработка ошибок
1app.UseExceptionHandler(errorApp =>2{3 errorApp.Run(async context =>4 {5 context.Response.ContentType = "application/json";6 var error = context.Features.Get<IExceptionHandlerFeature>();78 await context.Response.WriteAsJsonAsync(new9 {10 Status = 500,11 Message = "Internal server error"12 });13 });14});
Заключение
ASP.NET Core 8 предоставляет мощные инструменты для создания REST API. Минимальные API подходят для простых приложений, контроллеры — для сложных. Валидация, документация и обработка ошибок — обязательные компоненты продакшн-приложения.