Создание контроллера

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 12.12.2019

Создадим простейшее приложение на Web API, которое будет выполнять все основные операции с данными. Для этого создадим проект по типу Empty:

Первое приложение ASP.NET Core Web API

Далее добавим в проект новую папку 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:

Добавление контроллера в ASP.NET Core Web API

Назовем новый элемент 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 и по данному идентификатору удаляет объект из БД.

В итоге у нас получится следующий проект:

Проект ASP.NET Core Web API

Теперь, чтобы это все использовать, изменим код класса 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:

Первое приложение на ASP.NET Web API

Поскольку запрос из адресной строки браузера представляет GET-запрос, то его будет обрабатывать метод

[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> Get()
{
	return await db.Users.ToListAsync();
}

Этот метод возвратит всех пользователей из базы данных. Поэтому в браузере мы увидим все те данные, которые были добавлены в конструкторе.

Передадим параметр id:

ASP.NET Web API in ASP.NET Core

Поскольку это также запос типа 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);
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850