Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Создадим простейшее приложение на Web API, которое будет выполнять все основные операции с данными. Для этого создадим проект по типу Empty:
Далее добавим в проект новую папку Models, а в нее поместим новый класс User:
public class User { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } }
Для взаимодействия с MS SQL Server через Entity Framework через пакетный менеджер Nuget добавим в проект пакет Microsoft.EntityFrameworkCore.SqlServer.
Также добавим в папку Models новый класс UsersContext для взаимодействия с базой данных:
using Microsoft.EntityFrameworkCore; namespace WebAPIApp.Models { public class UsersContext : DbContext { public DbSet<User> Users { get; set; } public UsersContext(DbContextOptions<UsersContext> options) : base(options) { Database.EnsureCreated(); } } }
Далее добавим в проект новую папку Controllers, а в ней создадим новый api-контроллер. Для этого при добавлении нового элемента в проект можно использовать шаблон API Controller Class:
Назовем новый элемент UsersController.
После его создания изменим его код следующим образом:
using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc; using WebAPIApp.Models; using System.Threading.Tasks; namespace WebAPIApp.Controllers { [ApiController] [Route("api/[controller]")] public class UsersController : ControllerBase { UsersContext db; public UsersController(UsersContext context) { db = context; if (!db.Users.Any()) { db.Users.Add(new User { Name = "Tom", Age = 26 }); db.Users.Add(new User { Name = "Alice", Age = 31 }); db.SaveChanges(); } } [HttpGet] public async Task<ActionResult<IEnumerable<User>>> Get() { return await db.Users.ToListAsync(); } // GET api/users/5 [HttpGet("{id}")] public async Task<ActionResult<User>> Get(int id) { User user = await db.Users.FirstOrDefaultAsync(x => x.Id == id); if (user == null) return NotFound(); return new ObjectResult(user); } // POST api/users [HttpPost] public async Task<ActionResult<User>> Post(User user) { if (user == null) { return BadRequest(); } db.Users.Add(user); await db.SaveChangesAsync(); return Ok(user); } // PUT api/users/ [HttpPut] public async Task<ActionResult<User>> Put(User user) { if (user == null) { return BadRequest(); } if (!db.Users.Any(x => x.Id ==user.Id)) { return NotFound(); } db.Update(user); await db.SaveChangesAsync(); return Ok(user); } // DELETE api/users/5 [HttpDelete("{id}")] public async Task<ActionResult<User>> Delete(int id) { User user = db.Users.FirstOrDefault(x => x.Id == id); if (user == null) { return NotFound(); } db.Users.Remove(user); await db.SaveChangesAsync(); return Ok(user); } } }
Прежде всего к контроллеру применяется атрибут [ApiController], который позволяет использовать ряд дополнительных возможностей, в частности, в плане привязки модели и ряд других. Также к контроллеру применяется атрибут маршрутизации, который указывает, как контроллер будет сопоставляться с запросами.
В конструкторе контроллера получаем контекст данных и используем его для операций с данными. Также в конструкторе контроллера добавляем ряд начальных данных.
Контроллер API предназначен преимущественно для обработки запросов протокола HTTP: Get, Post, Put, Delete, Patch, Head, Options. В данном случае для каждого типа запросов в контроллере определен свои методы. Так, метод Get()
обрабатывает запросы типа GET и возвращает
коллекцию объектов из бд.
Если запрос Get содержит параметр id (идентификатор объекта), то он обрабатывается другим методом - Get(int id)
,
который возвращает объект по переданному id.
Запросы типа Post обрабатываются методом Post(User user)
, который получает из тела запроса отправленные данные и добавляет их в базу данных.
Метод Put(User user)
обрабатывает запросы типа Put - получает данные из запроса и изменяет ими объект в базе данных.
И метод Delete(int id)
обрабатывает запросы типа Delete, то есть запросы на удаление - получает из запроса параметр id и по данному идентификатору
удаляет объект из БД.
В итоге у нас получится следующий проект:
Теперь, чтобы это все использовать, изменим код класса Startup:
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Microsoft.EntityFrameworkCore; using WebAPIApp.Models; namespace WebAPIApp { public class Startup { public void ConfigureServices(IServiceCollection services) { string con = "Server=(localdb)\\mssqllocaldb;Database=usersdbstore;Trusted_Connection=True;"; // устанавливаем контекст данных services.AddDbContext<UsersContext>(options => options.UseSqlServer(con)); services.AddControllers(); // используем контроллеры без представлений } public void Configure(IApplicationBuilder app) { app.UseDeveloperExceptionPage(); app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); // подключаем маршрутизацию на контроллеры }); } } }
Чтобы задействовать контроллеры, в методе ConfigureServices()
вызывается метод services.AddControllers().
Чтобы подключить маршрутизацию контроллеров на основе атрибутов, в методе Configure()
вызывается метод endpoints.MapControllers().
После этого мы сможем обращаться к контроллеру через запрос api/users, поскольку к контроллеру применяется атрибут маршрутизации
[Route("api/[controller]")]
, где параметр "controller" указывает на название контроллера.
Запустим приложение и обратимся по пути api/users:
Поскольку запрос из адресной строки браузера представляет GET-запрос, то его будет обрабатывать метод
[HttpGet] public async Task<ActionResult<IEnumerable<User>>> Get() { return await db.Users.ToListAsync(); }
Этот метод возвратит всех пользователей из базы данных. Поэтому в браузере мы увидим все те данные, которые были добавлены в конструкторе.
Передадим параметр id:
Поскольку это также запос типа Get, но теперь также передается параметр id, то сработает следующий метод:
[HttpGet("{id}")] public IActionResult Get(int id) { User user = db.Users.FirstOrDefault(x => x.Id == id); if (user == null) return NotFound(); return new ObjectResult(user); }