引言:用C#编写REST API——其实很简单
\nREST API(表述性状态转移)是一种用于创建Web服务的架构风格,如今几乎每个现代应用程序都在使用它。如果你想快速学会用C#编写后端,那么ASP.NET Core是最佳起点。在本文中,我们将在30分钟内创建一个用于管理任务列表(Todo List)的完整REST API。你将了解如何配置项目、编写控制器、连接数据库以及通过Swagger测试API。
\n准备好了吗?我们开始吧!
\n\n步骤1:创建项目并配置环境
\n首先,我们需要安装.NET SDK(6.0或更高版本)。可以从微软官方网站下载。安装完成后,打开终端或命令行,创建一个新项目:
\ndotnet new webapi -n TodoApi\ncd TodoApi\n此命令将创建一个预装了Swagger的Web API模板。在Visual Studio Code或任何其他IDE中打开该项目。项目结构已包含Controllers、Models文件夹和Program.cs文件。
现在,添加Entity Framework Core支持以操作数据库。安装必要的包:
\ndotnet add package Microsoft.EntityFrameworkCore.InMemory\ndotnet add package Microsoft.EntityFrameworkCore.Design\n为简单起见,我们使用InMemory数据库——数据将存储在内存中。对于生产环境,你可以将其替换为SQL Server或PostgreSQL。
\n\n步骤2:创建数据模型和数据库上下文
\n创建TodoItem模型。在Models文件夹中创建文件TodoItem.cs:
namespace TodoApi.Models;\n\npublic class TodoItem\n{\n public long Id { get; set; }\n public string? Title { get; set; }\n public bool IsComplete { get; set; }\n}\n现在创建数据库上下文。在Data文件夹中(如果没有则创建),添加文件TodoContext.cs:
using Microsoft.EntityFrameworkCore;\nusing TodoApi.Models;\n\nnamespace TodoApi.Data;\n\npublic class TodoContext : DbContext\n{\n public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }\n public DbSet<TodoItem> TodoItems { get; set; }\n}\n在Program.cs中注册上下文:
using Microsoft.EntityFrameworkCore;\nusing TodoApi.Data;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddDbContext<TodoContext>(opt =>\n opt.UseInMemoryDatabase("TodoList"));\n\nbuilder.Services.AddControllers();\nbuilder.Services.AddEndpointsApiExplorer();\nbuilder.Services.AddSwaggerGen();\n\nvar app = builder.Build();\n\nif (app.Environment.IsDevelopment())\n{\n app.UseSwagger();\n app.UseSwaggerUI();\n}\n\napp.UseHttpsRedirection();\napp.UseAuthorization();\napp.MapControllers();\napp.Run();\n\n步骤3:编写带有CRUD操作的控制器
\n创建用于处理任务的控制器。在Controllers文件夹中添加文件TodoItemsController.cs:
using Microsoft.AspNetCore.Mvc;\nusing Microsoft.EntityFrameworkCore;\nusing TodoApi.Data;\nusing TodoApi.Models;\n\nnamespace TodoApi.Controllers;\n\n[Route("api/[controller]")]\n[ApiController]\npublic class TodoItemsController : ControllerBase\n{\n private readonly TodoContext _context;\n\n public TodoItemsController(TodoContext context)\n {\n _context = context;\n }\n\n // GET: api/TodoItems\n [HttpGet]\n public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems()\n {\n return await _context.TodoItems.ToListAsync();\n }\n\n // GET: api/TodoItems/5\n [HttpGet("{id}")]\n public async Task<ActionResult<TodoItem>> GetTodoItem(long id)\n {\n var todoItem = await