使用 .NET 9 的最小 Web API
REST API 简介
REST,全称为Representational State Transfer(表现层状态转移),是一种架构风格,定义了一组规则来创建Web服务。在客户端与服务器通信时,REST建议创建一个对象来表示客户端请求的数据,并将该对象的状态发送给用户作为响应。例如,如果用户请求在班加罗尔某个时间和地点预订出租车,服务器端可以创建一个对象来表示这个请求,并将对象的状态发送给用户。因此,REST被称为表现层状态转移。
REST API 的原则
以下是REST的六个指导原则:
无状态
URL用于唯一标识资源,请求体包含所请求资源的状态。服务器处理请求后,通过响应体、状态码或头部将响应发送给客户端。客户端发送的每个请求都包含服务器理解请求所需的所有信息,这些信息可以是URL的一部分、查询字符串参数、请求体或头部。服务器API不缓存任何状态,因此每个请求都是相互独立的。这种REST行为还有助于在云环境中扩展API服务。
客户端-服务器
客户端-服务器架构实现了统一的接口,并将客户端与服务器分离。这提高了跨多个平台的可移植性以及服务器组件的可扩展性。
统一接口
为了在整个应用程序中实现统一性,REST有以下四个接口约束:
-
资源标识 -
使用表示来操作资源 -
自描述消息 -
超媒体作为应用状态的引擎
可缓存
为了提高性能,应用程序通常被设计为可缓存的。这是通过将服务器的响应标记为可缓存或不可缓存来实现的,无论是隐式还是显式。如果响应被拒绝为可缓存,则客户端缓存可以将来重用响应数据以响应等效请求。
.NET 中的最小API
在.NET 9、.NET 8或.NET 7中,最小API被设计为创建具有最小依赖性的HTTP API。它们非常适合微服务和希望仅包含最少文件、功能和依赖项的ASP.NET Core应用程序。
最小API的限制
-
不支持过滤器,例如IAsyncAuthorizationFilter、IAsyncActionFilter等。 -
不支持模型绑定,即IModelBinderProvider、IModelBinder。可以通过自定义绑定垫片添加支持。 -
不支持表单绑定,包括IFormFile。计划将来添加对IFormFile的支持。 -
没有内置的验证支持,即IModelValidator。 -
不支持应用程序部分或应用程序模型。没有办法应用或构建自己的约定。 -
没有内置视图渲染支持。建议使用Razor Pages来渲染视图。 -
不支持JsonPatch。 -
不支持OData。 -
不支持ApiVersioning。
REST API 示例
REST API遵循标准的HTTP动词,如GET、POST、PUT、DELETE和PATCH,这些基本上是对对象进行CRUD操作。API被安排形成一个互联网资源。例如,在上面的示例中,我们有一个资源“todoitem”,可以使用API创建、修改和删除,并相应地形成URL格式。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// 添加服务到容器
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext(opt => opt.UseInMemoryDatabase("TodoList"));
var app = builder.Build();
// 配置HTTP请求管道
if (app.Environment.IsDevelopment()) {
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapGet("/", () => "Hello World!");
app.MapGet("/todoitems", async (TodoDb db) => await db.Todos.ToListAsync());
// ... 其他路由配置
class Todo {
public int Id { get; set; }
public string? Name { get; set; }
public bool IsComplete { get; set; }
}
class TodoDb : DbContext {
public TodoDb(DbContextOptions options) : base(options) {}
public DbSet Todos => Set();
}
结论
REST架构风格提供了一种在互联网上安排资源的标准化方式,以及客户端访问和获取服务器数据的通用方式。最小API需要最少的代码,并且是一种快速简便的方法来创建API,这些API不需要身份验证或位于具有身份验证的网关后面,并且具有非常少的依赖性。