ASP.NET Core 5 REST API 逐步教程
在这篇文章中,我们将创建一个简单的 Asp.Net Core Rest API 待办事项应用程序,用户可以在其中添加、编辑、删除和查看待办事项,我们将使用 SQLite 来存储数据。
您也可以在 YouTube 上观看完整的分步视频:
同时,您也可以下载源代码:
https://github.com/mohamadlawand087/v6-RestApiNetCore5
这是 API 开发系列的第一部分:
- 第二部分:https://dev.to/moe23/asp-net-core-5-rest-api-authentication-with-jwt-step-by-step-140d
- 第三部分:https://dev.to/moe23/refresh-jwt-with-refresh-tokens-in-asp-net-core-5-rest-api-step-by-step-3en5
开始之前我们需要准备以下4样东西:
- Visual Studio Code(https://code.visualstudio.com/)
- Dotnet 核心 SDK ( https://dotnet.microsoft.com/download )
- Postman(https://www.postman.com/downloads/)
- DBeaver(https://dbeaver.io/download/)
下载并安装完所有必需的工具后,我们需要确保 .NET SDK 已成功安装。为此,我们需要打开终端,并通过检查 .NET 版本来确认 .NET SDK 是否已成功安装。
打开终端,输入以下命令
dotnet --version
现在我们需要安装实体框架工具。
dotnet tool install --global dotnet-ef
完成后,我们需要创建我们的应用程序。
dotnet new webapi -n "TodoApp" -lang "C#" -au none
现在让我们添加使用 EntityFramework 和 SQLite 所需的软件包。
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Tools
现在我们打开 VS Code,检查一下我们的应用程序和源代码,然后构建应用程序,看看它是否能运行。
dotnet build
dotnet run
首先,我们移除.Net Core框架为我们生成的默认模板代码。这将删除WeatherForcastController和WeatherForcast类。
我们将创建自己的控制器,并将其命名为 TodoController。
我们将创建第一个简单的操作,并将其命名为 TestRun,现在开始编写控制器代码。
[Route("api/[controller]")] // We define the routing that our controller going to use
[ApiController] // We need to specify the type of the controller to let .Net core know
public class TodoController : ControllerBase
{
[Route("TestRun")] // define the routing for this action
[HttpGet]
public ActionResult TestRun()
{
return Ok("success");
}
}
添加完成后,我们需要进行测试。为此,我们需要执行以下操作:
dotnet build
dotnet run
应用程序运行后,我们需要打开 Postman 并在那里进行尝试,看看是否能收到响应。
我们在 Postman 中创建一个新请求,并将类型设置为 GET,然后添加以下 URL:
(https://localhost:5001/api/todo/)testrun如您所见,我们的测试在 Postman 中得到了成功响应。
测试完成后,我们需要开始添加模型。我们在根目录下创建一个名为 models 的文件夹,并在其中添加一个名为 Item 的类。这是一个非常简单的模型,代表我们的待办事项列表项。
public class ItemData
{
public int Id { get; set; }
public string Title { get; set; }
public string Details { get; set; }
public bool Done { get; set; }
}
添加完模型后,接下来需要构建 ApiDbContext。我们需要在根目录下创建一个名为 Data 的文件夹,并在该文件夹内创建一个名为 ApiDbContext 的新类。
public class ApiDbContext: DbContext
{
public DbSet<ItemData> Items {get;set;}
public ApiDbContext(DbContextOptions<ApiDbContext> options) : base(options)
{
}
}
我们需要在 appsettings.json 应用程序中指定连接字符串。
"ConnectionStrings": {
"DefaultConnection": "DataSource=app.db;Cache=Shared"
},
一旦我们的 DbContext 和连接字符串准备就绪,接下来我们需要更新启动类,以便在应用程序内部使用 Application DbContext。打开根文件夹中的启动类,并添加以下代码。
services.AddDbContext<ApiDbContext>(options =>
options.UseSqlite(
Configuration.GetConnectionString("DefaultConnection")));
添加 DbContext 中间件后,我们需要添加初始迁移来创建数据库。
dotnet ef migrations add "Initial Migrations"
dotnet ef database update
数据库更新成功完成后,我们可以看到一个名为 migrations 的新文件夹,其中包含负责创建数据库及其表 Item 的 C# 脚本。我们可以通过在根目录中看到 app.db 文件来验证数据库是否已创建。此外,我们还可以使用 SQLite 浏览器来验证表是否已成功创建。
现在我们已经完成了控制器的所有基础架构工作。接下来我们需要开始构建 TodoController 并将其连接到 ApiDbContext。
首先,我们将把“获取待办事项”添加到我们的待办清单中。
[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase
{
private readonly ApiDbContext _context;
public TodoController(ApiDbContext context)
{
_context = context;
}
[HttpGet]
public ActionResult GetItems()
{
var items = _context.Items.ToList();
return Ok(items);
}
[HttpGet("{id}")]
public async Task<IActionResult> GetItem(int id)
{
var item = await _context.Items.FirstOrDefaultAsync(z => z.Id == id);
if(item == null)
return NotFound();
return Ok(item);
}
[HttpPost]
public async Task<IActionResult> CreateItem(ItemData data)
{
if(ModelState.IsValid)
{
await _context.Items.AddAsync(data);
await _context.SaveChangesAsync();
return CreatedAtAction("GetItem", new {data.Id}, data);
}
return new JsonResult("Somethign Went wrong") {StatusCode = 500};
}
[HttpPut("{id}")]
public async Task<IActionResult> UpdateItem(int id, ItemData item)
{
if(id != item.Id)
return BadRequest();
var existItem = await _context.Items.FirstOrDefaultAsync(z => z.Id == id);
if(existItem == null)
return NotFound();
existItem.Title = item.Title;
existItem.Details = item.Details;
existItem.Completed = item.Completed;
await _context.SaveChangesAsync();
// Following up the REST standart on update we need to return NoContent
return NoContent();
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteItem(int id)
{
var existItem = await _context.Items.FirstOrDefaultAsync(z => z.Id == id);
if(existItem == null)
return NotFound();
_context.Items.Remove(existItem);
await _context.SaveChangesAsync();
return Ok(existItem);
}
}
我们可以用 Postman 测试这些功能。
最后,由于我们在创建 Web API 项目时使用的是 .Net 5,Swagger 将已经集成到我们的应用程序中,为了查看 Swagger 界面,我们需要访问 ( http://localhost:5000/swagger/index.html ) 。
Swagger 允许您描述 API 的结构,以便机器可以读取它们。除了在旧版本的 .NET Core 中定义 Swagger 之外,我们无需进行任何额外工作。Swagger 能够读取我们的 API 结构,并为我们提供一个可用于增强开发体验的 UI。
感谢您阅读本文。
这是 API 开发系列的第一部分:
- 第二部分:https://dev.to/moe23/asp-net-core-5-rest-api-authentication-with-jwt-step-by-step-140d
- 第三部分:https://dev.to/moe23/refresh-jwt-with-refresh-tokens-in-asp-net-core-5-rest-api-step-by-step-3en5
