本教程介绍了使用ASP.NET Core构建Web API的基础知识。
在本教程中,您将学习如何:
创建一个Web API项目 | √ |
添加模型类和数据库上下文 | √ |
添加控制器 | √ |
添加CRUD方法 | √ |
配置路由和URL路径 | √ |
指定返回值 | √ |
使用Postman调用Web API | √ |
使用jQuery调用Web API | √ |
最后,您有一个Web API,可以管理存储在关系数据库中的“待办事项”。
本教程将创建以下API:

下图显示了应用程序的设计:

使用Visual Studio 2019创建Web项目
大家都知道,
测试API
项目模板创建一个values API。从浏览器中调用Get方法来测试应用程序。
按Ctrl + F5运行该应用程序。Visual Studio启动浏览器并导航到https://localhost:
如果出现一个对话框,询问您是否应该信任IIS Express证书,请选择“ 是”。在接下来出现的“ 安全警告”对话框中,选择“ 是”。
返回以下JSON:
["value1","value2"]
添加模型类
模型是一组表示应用程序管理的数据的类。这个应用程序的模型是一个单独的TodoItem类。
-
在解决方案资源管理器中,右键单击项目。选择添加 > 新建文件夹。将文件夹命名为Models。
-
右键单击Models文件夹,然后选择Add > Class。将类命名为TodoItem并选择Add。
-
使用以下代码替换模板代码:
namespace TodoApi.Models{ public class TodoItem { public long Id { get; set; } public string Name { get; set; } public bool IsComplete { get; set; } }}
该Id属性用作关系数据库中的唯一键。
模型类可以在项目中的任何位置,但模型文件夹按惯例使用。
添加数据库上下文
该数据库上下文是协调实体框架功能的数据模型的主要类。该类是通过派生类创建的Microsoft.EntityFrameworkCore.DbContext。
-
右键单击Models文件夹,然后选择Add>Class,将类命名为TodoContext,然后单击“添加”。
-
使用以下代码替换模板代码:
using Microsoft.EntityFrameworkCore;namespace TodoApi.Models{ public class TodoContext : DbContext { public TodoContext(DbContextOptions options) : base(options) { } public DbSet TodoItems { get; set; } }}
注册数据库上下文
在ASP.NET Core中,必须使用依赖注入(DI)容器注册DB上下文等服务。容器为控制器提供服务。
使用以下突出显示的代码更新Startup.cs:
// Unused usings removedusing Microsoft.AspNetCore.Builder;using Microsoft.AspNetCore.Hosting;using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using Microsoft.Extensions.Configuration;using Microsoft.Extensions.DependencyInjection;using TodoApi.Models;namespace TodoApi{ public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the //container. public void ConfigureServices(IServiceCollection services) { services.AddDbContext(opt => opt.UseInMemoryDatabase("TodoList")); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); } // This method gets called by the runtime. Use this method to configure the HTTP //request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for // production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseMvc(); } }}
上面的代码:
-
删除未使用的using声明。
-
将数据库上下文添加到DI容器。
-
指定数据库上下文将使用内存数据库。
添加控制器
-
右键单击“控制器”文件夹。
-
选择添加>新项。
-
在“添加新项”对话框中,选择“API控制器类”模板。
-
将类命名为TodoController,然后选择Add。

使用以下代码替换模板代码:
using Microsoft.AspNetCore.Mvc;using Microsoft.EntityFrameworkCore;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using TodoApi.Models;namespace TodoApi.Controllers{ [Route("api/[controller]")] [ApiController] public class TodoController : ControllerBase { private readonly TodoContext _context; public TodoController(TodoContext context) { _context = context; if (_context.TodoItems.Count() == 0) { // Create a new TodoItem if collection is empty, // which means you can't delete all TodoItems. _context.TodoItems.Add(new TodoItem { Name = "Item1" }); _context.SaveChanges(); } } }}
上面的代码:
-
定义没有方法的API控制器类。
-
使用[ApiController]属性装饰类,此属性指示控制器响应Web API请求。
-
使用DI将数据库context(TodoContext)注入控制器,数据库上下文用于控制器中的每个CRUD方法。
-
如果数据库为空,则向数据库添加名为Item1的项。此代码位于构造函数中,因此每次有新的HTTP请求时它都会运行。如果删除所有项目,构造函数将在下一次调用API方法时再次创建Item1。所以当删除操作真正起作用的时候,它可能看起来并没有起作用。
添加Get方法
要提供检索待办事项的API,请将以下方法添加到TodoController类中:
// GET: api/Todo[HttpGet]public async Task GetTodoItems(){ return await _context.TodoItems.ToListAsync();}// GET: api/Todo/5[HttpGet("{id}")]public async Task GetTodoItem(long id){ var todoItem = await _context.TodoItems.FindAsync(id); if (todoItem == null) { return NotFound(); } return todoItem;}
这些方法实现了两个GET端点:
-
GET /api/todo
-
GET /api/todo/{id}
如果应用程序还在运行,就停止它,然后再次运行,这样才能包含最新的更改。
通过从浏览器调用这两个端点来测试应用程序。例如:
-
https://localhost:
-
https://localhost:
调用GetTodoItems生成以下HTTP响应:
[ { "id": 1, "name": "Item1", "isComplete": false }]
路由和URL路径
该[HttpGet]属性表示响应HTTP GET请求的方法。每个方法的URL路径构造如下:
-
从控制器的Route属性中的模板字符串开始:
namespace TodoApi.Controllers{ [Route("api/[controller]")] [ApiController] public class TodoController : ControllerBase { private readonly TodoContext _context;
-
用控制器的名称替换[controller],按照惯例,控制器类名减去“controller”后缀。例如控制器类名是TodoController,因此控制器名是“todo”。ASP.NET核心路由不区分大小写。
-
如果[HttpGet]属性有一个路由模板(例如[HttpGet(“products”)]),则将其附加到路径。
在下面的GetTodoItem方法中,“{id}”是一个占位符变量,用于to-do项的唯一标识符。当调用GetTodoItem时,URL中的“{id}”值将提供给itsid参数。
// GET: api/Todo/5[HttpGet("{id}")]public async Task GetTodoItem(long id){ var todoItem = await _context.TodoItems.FindAsync(id); if (todoItem == null) { return NotFound(); } return todoItem;}
想要了解 Visual Studio 更多资源的伙伴,请点这里。
想要获取 Visual Studio 正版授权的伙伴,请点这里。

标签:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!