在我们开始之前,本文的代码 .net6.0示例:https://download.csdn.net/download/hefeng_aspnet/89921074。
.net7.0 示例非本文代码请参考:https://download.csdn.net/download/hefeng_aspnet/89921108
.net8.0 示例非本文代码请参考: https://download.csdn.net/download/hefeng_aspnet/89921105
什么是 REST API?
REST 代表表述性状态转移。它是一种架构风格,定义了一组创建 Web 服务的规则。在客户端-服务器通信中,REST 建议创建一个客户端请求的数据对象,并将该对象的值发送给用户。例如,如果用户请求在某个时间和地点预订班加罗尔的出租车,那么您可以在服务器端创建一个对象。所以,在这里,你有一个对象,并且你正在发送一个对象的状态。因此,REST 被称为表述性状态转移。
REST 的架构风格有助于利用较少的带宽,使应用程序更适合互联网。它通常被视为“互联网语言”,完全基于资源。
REST API 原理
以下是 REST 的六个指导原则:
无状态
URL 用于唯一标识资源,主体保存请求资源的状态。服务器处理请求后,将通过主体、状态或标头向客户端发送响应。从客户端发送到服务器的请求将包含所有必需的信息,以使服务器理解从客户端发送的请求。这可以是 URL、查询字符串参数、主体甚至标头的一部分。服务器 API 中没有缓存任何状态,因此每个请求彼此之间都是不可知的。REST 的这种行为还有助于在云环境中扩展 API 服务。
客户端-服务器
客户端-服务器架构实现了统一的接口,将客户端与服务器分开。这增强了跨平台的可移植性以及服务器组件的可扩展性。
统一接口
为了获得整个应用程序的统一性,REST 有以下四个接口约束:
· 资源识别
· 使用表述进行资源操作
· 自我描述信息
· 超媒体作为应用程序状态的引擎
可缓存
为了提供更好的性能,应用程序通常被设计为可缓存的。这是通过隐式或显式地将来自服务器的响应标记为可缓存或不可缓存来实现的。如果响应被拒绝为可缓存的,那么客户端缓存可以在将来重用响应数据以获得等效响应。
.Net 8 或 .Net 7 中的最少 API
最小 API 的架构旨在创建具有最少依赖项的 HTTP API。它们非常适合希望在 ASP.NET Core 中仅包含最少文件、功能和依赖项的微服务和应用。
最小 API 的限制
1. 不支持过滤器:例如,不支持 IAsyncAuthorizationFilter、IAsyncActionFilter、
2. IAsyncExceptionFilter、IAsyncResultFilter 和 IAsyncResourceFilter。
3. 不支持模型绑定,即 IModelBinderProvider、IModelBinder。可以使用自定义绑定垫片添加支持。
4. 不支持从表单进行绑定。这包括绑定 IFormFile。我们计划在未来添加对 IFormFile 的支持。
5. 没有内置对验证的支持,即 IModelValidator
6. 不支持应用程序部件或应用程序模型。无法应用或构建自己的约定。
7. 没有内置视图渲染支持。我们建议使用 Razor Pages 来渲染视图。
8. 不支持 JsonPatch
9. 不支持 OData
10. 不支持 ApiVersioning。请参阅此问题了解更多详细信息。
为了演示 .net 6 中的最小 API,在这里创建了一个示例,
REST API 遵循标准 HTTP 动词,如 GET、POST、PUT、DELETE、PATCH,这些动词基本上是对对象的 CRUD 操作。这些 API 被排列成一个互联网资源。例如,在上面的例子中,我们有“todoitem”这个资源,可以使用 API 创建、修改、删除,并相应地形成 URL 格式。
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext < TodoDb > (opt => opt.UseInMemoryDatabase("TodoList"));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment()) {
app.UseSwagger();
app.UseSwaggerUI();
}
app.MapGet("/", () => "Hello World!");
app.MapGet("/todoitems", async (TodoDb db) => await db.Todos.ToListAsync());
app.MapGet("/todoitems/complete", async (TodoDb db) => await db.Todos.Where(t => t.IsComplete).ToListAsync());
app.MapGet("/todoitems/{id}", async (int id, TodoDb db) => await db.Todos.FindAsync(id)
is Todo todo ? Results.Ok(todo) : Results.NotFound());
app.MapPost("/todoitems", async (Todo todo, TodoDb db) => {
db.Todos.Add(todo);
await db.SaveChangesAsync();
return Results.Created($ "/todoitems/{todo.Id}", todo);
});
app.MapPut("/todoitems/{id}", async (int id, Todo inputTodo, TodoDb db) => {
var todo = await db.Todos.FindAsync(id);
if (todo is null) return Results.NotFound();
todo.Name = inputTodo.Name;
todo.IsComplete = inputTodo.IsComplete;
await db.SaveChangesAsync();
return Results.NoContent();
});
app.MapDelete("/todoitems/{id}", async (int id, TodoDb db) => {
if (await db.Todos.FindAsync(id) is Todo todo) {
db.Todos.Remove(todo);
await db.SaveChangesAsync();
return Results.Ok(todo);
}
return Results.NotFound();
});
app.Run();
class Todo {
public int Id {
get;
set;
}
public string ? Name {
get;
set;
}
public bool IsComplete {
get;
set;
}
}
class TodoDb: DbContext {
public TodoDb(DbContextOptions < TodoDb > options): base(options) {}
public DbSet < Todo > Todos => Set < Todo > ();
}
结论
REST 架构风格提供了一种在互联网上安排资源的标准方法,以及一种客户端访问和获取服务器数据的通用方法。最小 API 需要最少的代码,并且可以快速轻松地创建不需要 Auth 或位于网关后面(使用 Auth)且依赖性极小的 API。
参考