示例代码:https://download.csdn.net/download/hefeng_aspnet/89961212
在这篇文章中,将演示如何使用 ASP.NET Core 6.0 和 Entity Framework Core 构建 RESTful Web API。
.NET 6 是目前最新的 LTS(长期支持)版本,将支持到 2024 年 11 月 12 日。
该 API 将管理存储在关系数据库(SQL Server)中的电影记录,如下表所述:
本文内容如下:
- 什么是 REST?
- 创建 Web API 项目
- 添加模型
- 添加数据库上下文
- 使用迁移创建数据库
- 创建 API 控制器和方法
我们的计算机上需要安装以下工具:
如果你准备好了,那我们开始吧。
什么是 REST?
RESTful API 符合 REST 架构风格。
REST,即REST表现层,是一种在网络上的计算机系统之间提供标准的架构风格,使得系统之间更容易相互通信。
REST 依赖于客户端-服务器关系。这实质上意味着客户端应用程序和服务器应用程序必须能够独立发展,彼此之间不具有任何依赖性。
REST 是无状态的。这意味着客户端和服务器之间的通信始终包含执行请求所需的所有信息。服务器中没有会话状态,它完全保存在客户端。
REST 为组件之间提供了统一的接口。资源公开了类似目录结构的 URI。
REST 与 HTTP 并非严格相关,但通常与之相关联。我们在请求中使用四个基本 HTTP 动词来与 REST 系统中的资源进行交互:
- GET — 检索特定资源(通过 id)或资源集合
- POST — 创建新资源
- PUT — 更新特定资源(通过 id)
- DELETE — 根据 ID 删除特定资源
在 REST 系统中,表示传输JSON或XML来表示数据对象和属性。
REST 对 Web 的影响如此之大,它已经基本取代了基于 SOAP 的界面设计,因为它是一种使用起来相当简单的风格。
现在我们已经对 REST 进行了快速回顾,我们可以继续实施了。
创建 Web API 项目
打开 Visual Studio 2022 并选择创建新项目,然后选择ASP.NET Core Web API:
并在以下屏幕中为您的项目命名,然后单击下一步。
在下一个屏幕中,选择.NET 6.0作为框架,然后单击创建:
此时我们有一个启动项目如下:
默认项目结构
在Program.cs中,我们看到 Swagger 支持已自动添加到我们的项目中:
最初创建 Program.cs
并且还将Swashbuckle.AspNetCore NuGet 包添加为依赖项。
有关 Swagger 的更多信息,请参阅带有 Swagger/OpenAPI 的 ASP.NET Core Web API 文档。
现在,让我们运行(Ctlr+F5)项目以查看默认输出。当浏览器打开并显示 Swagger UI 时,选择WeatherForecast部分中的GET方法,然后选择Try It Out and Execute:
浏览器中的 Swagger UI
另外,您可以使用 Swagger UI 中显示的 curl URL 来执行此方法,并在浏览器中查看该 URL 的结果:
当我们运行应用程序时,默认 URL 来自launchSettings.json:
launchSettings.json
结果值来自 WeatherForecastController 的 GET方法:
WeatherForecatController.cs
如您所见,这里的值是硬编码的,并且添加了随机性以生成不同的值。
在我们的 Web API 中,我们将在 SQL 服务器数据库中创建自己的记录,并能够通过 REST API 端点查看、更新和删除它们。
添加模型
现在,我们将实现我们的数据模型类。
在解决方案资源管理器中,右键单击项目。选择添加->新文件夹,并将文件夹命名为模型。
然后右键单击Models文件夹并选择Add->Class。将类命名为Movie.cs 并单击Add。
接下来,向类添加以下属性:

Movie.cs
该Id
字段是数据库的主键所必需的。
实体框架核心
我们将使用我们的模型和Entity Framework Core (EF Core)来处理数据库。
EF Core 是一个对象关系映射 (ORM) 框架,可简化数据访问代码。模型类对 EF Core 没有任何依赖。它们仅定义将存储在数据库中的数据的属性。
在这篇文章中,我们将首先编写模型类,然后EF Core将创建数据库。这称为代码优先方法。
让我们将 EF Core NuGet 包添加到项目中。右键单击项目并选择管理 NuGet 包…,然后安装以下包:
NuGet 包管理器
添加数据库上下文
数据库上下文是协调数据模型的实体框架功能的主要类。此类是通过从Microsoft.EntityFrameworkCore.DbContext类派生而创建的。
现在,右键单击该Models
文件夹并选择Add ->Class。将类命名为MovieContext并单击Add。然后将以下代码添加到该类中:
MovieContext.cs
更新(2023 年 8 月 26 日):您需要public
在上面一行中添加关键字,如下所示:
public DbSet<Movie> Movies { get; set; } = null!;
上述代码DbSet<Movie>
为实体集创建了一个属性。
在实体框架术语中,实体集通常对应于数据库表,实体对应于表中的一行。
通过调用对象上的方法将连接字符串的名称传递到上下文中DbContextOptions
。对于本地开发,ASP.NET Core 配置系统从appsettings.json文件中读取连接字符串。
我们需要将连接字符串添加到appsettings.json中。我将在我的机器中使用本地 SQL 服务器实例,我们可以按如下方式定义连接字符串:
appsettings.json
如果需要,您可以更改数据库名称。
依赖注入
ASP.NET Core 使用依赖注入 (DI)构建。服务(例如 EF Core DB 上下文)在应用程序启动时向 DI 注册。需要这些服务的组件通过构造函数参数提供这些服务。
现在,我们将数据库上下文注册到内置的 IOC 容器。将以下代码添加到Program.cs:
Program.cs
使用迁移创建数据库
现在,我们将使用 EF Core Migrations功能创建数据库。
迁移让我们可以创建一个与我们的数据模型相匹配的数据库,并在数据模型发生变化时更新数据库模式。
首先,我们将添加初始迁移。
打开工具 -> NuGet 包管理器 > 包管理器控制台 (PMC),并在 PMC 中运行以下命令:
Add-Migration Initial
该命令生成代码以创建初始Add-Migration
数据库模式,该模式基于MovieContext类中指定的模型。Initial参数是迁移名称,可以使用任何名称。
运行命令后,在Migrations文件夹下会创建一个迁移文件:
初始迁移文件
接下来在 PMC 中运行以下命令:
Update-Database
该Update-Database
命令运行Migrations/{time-stamp}_Initial.csUp
文件中的方法,创建数据库。
现在,我们将检查创建的数据库。打开视图 -> SQL Server 对象资源管理器。
您将看到新创建的数据库,如下所示:
SQL Server 对象资源管理器
如您所见,Movie表和Migrations History表已自动创建。然后在迁移历史表中插入一条记录,以显示数据库中已执行的迁移。
创建 API 控制器和方法
在本节中,我们将创建电影 API 控制器并向其中添加方法,同时还将测试这些方法。
我们先添加控制器。右键单击Controller文件夹并选择Add -> Controller..,然后选择API Controller - Empty,如下所示:
单击“添加”并在下一个屏幕上为您的控制器命名。
MoviesController创建如下:
MoviesController.cs
如您所见,该类用属性修饰。此属性表示控制器响应 Web API 请求。[ApiController]
MoviesController类继承自ControllerBase。
接下来我们通过控制器的构造函数注入上一节提到的数据库上下文。添加以下代码:
MoviesController.cs
现在,我们将向控制器添加CRUD (创建、读取、更新和删除)操作方法。让我们从 GET 方法开始。
GET 方法
将以下代码添加到MoviesController
:
GET 方法
GetMovies
方法返回所有电影,方法返回具有输入所给IdGetMovie(int id)
的电影。它们用[HttpGet]属性修饰,表示方法响应 HTTP GET 请求。
这些方法实现了两个 GET 端点:
- 获取 /api/电影
- 获取 /api/Movies/{id}
我们可以通过从浏览器调用两个端点来测试应用程序,如下所示:
https://localhost:{port}/api/movies
https://localhost:{port}/api/movies/{id}
方法的返回类型GetMovie
为ActionResult<T> 类型。ASP.NET Core 会自动将对象序列化为JSON ,并将 JSON 写入响应消息的正文中。假设没有未处理的异常,此返回类型的响应代码为200 。未处理的异常将转换为5xx错误。
路由和 URL 路径
每种方法的URL路径构造如下:
从控制器的 Route 属性中的模板字符串开始 ( Route("api/[controller]")
)。然后将其替换[controller]
为控制器的名称,按照惯例,该名称是控制器类名减去Controller后缀。对于此示例,控制器类名为MoviesController
,因此控制器名为movies
。
ASP.NET Core路由不区分大小写。
测试 GetMovie 方法
现在我们将测试这些端点。在此之前,让我们将一些电影记录插入到表中。
转到SQL Server 对象资源管理器并右键单击电影表并选择查看数据:
然后手动向表中添加一些电影记录:
我们不需要为Id列添加数据,因为 SQL Server 会自动为我们处理。
现在,我们可以测试 GET 端点。启动(Ctlr+F5)应用程序:
选择第一个 GET 方法并点击Try it out -> Execute:
这将显示应用程序中的所有电影。
接下来,单击第二个 GET 方法并单击“试用” ,在id字段中输入上面的某个Id,然后单击“执行”:
如果没有项目与请求的 Id 匹配,该方法将返回404 NotFound错误代码。
POST 方法
将以下代码添加到MoviesController
:
POST 方法
PostMovie
方法在数据库中创建电影记录。上述代码是 HTTP POST 方法,如[HttpPost]属性所示。该方法从 HTTP 请求的正文中获取电影记录的值。
方法CreatedAtAction
:
- 如果成功,则返回HTTP 201状态代码。HTTP 201 是在服务器上创建新资源的 HTTP POST 方法的标准响应。
Location
向响应添加标头。Location
标头指定新创建的电影记录的 URI。- 引用
GetMovie
操作来创建Location
标头的 URI。
测试 PostMovie 方法
启动应用程序,然后在电影部分中选择 POST 方法。
点击试用,在请求体中输入想要添加的电影信息:
并点击执行。
响应状态代码为201(已创建),并且位置标头添加到响应中,如下所示:
我们可以将此位置 URL 粘贴到浏览器中并查看那里的响应:
另外,我们可以从本地数据库的电影表中检查此记录:
PUT 方法
将以下代码添加到MoviesController
:
PUT 方法
PutMovie
方法使用给定的Id更新数据库中的电影记录。 上述代码是 HTTP PUT 方法,如 [ HttpPut ] 属性所示。该方法从 HTTP 请求的正文中获取电影记录的值。您需要在请求 URL 和正文中提供Id,并且它们必须匹配。根据 HTTP 规范,PUT 请求要求客户端发送整个更新的实体,而不仅仅是更改。
如果操作成功,则响应为204(无内容) 。
测试 PutMovie 方法
启动应用程序,然后在电影部分中选择 PUT 方法。
点击试用,在请求体中输入需要更新的电影信息,在id字段中输入电影的Id:
然后单击“执行”。
我们可以通过 Swagger UI 中的 GET 方法使用 Id 检查电影的更新状态,也可以直接从浏览器中检查,如下所示:
我们也可以在数据库中看到更新的信息:
Movies
如果我们尝试更新数据库中不存在的记录,我们会收到404 Not Found错误:
DELETE 方法
将以下代码添加到MoviesController
:
DeleteMovie
方法删除数据库中具有给定Id 的电影记录。 上述代码是 HTTP DELETE 方法,如 [ HttpDelete ] 属性所示。此方法需要URL 中的Id来标识我们要删除的电影记录。
测试 DeleteMovie 方法
启动应用程序,然后在电影部分中选择 DELETE 方法。
点击尝试一下,然后在id字段中输入要删除的电影的Id:
然后单击“执行”。
您可能已经注意到,我们不需要提供请求主体。响应状态为204 无内容。
如果我们尝试使用浏览器获取此电影记录,我们会收到预期的404 Not Found错误:
我们也可以从数据库中检查该记录是否已被删除:
参考
https://www.codecademy.com/articles/what-is-rest
https://ninenines.eu/docs/en/cowboy/2.6/guide/rest_principles/
https://restfulapi.net/rest-architectural-constraints/
Tutorial: Create a web API with ASP.NET Core | Microsoft Learn