使用 .NET 6 的精简 API 开始使用
TLDR;使用最少的 API,您可以利用顶级语句等新功能,仅用 4 行代码创建 Web API。
为什么要使用最小 API
想要用几行代码创建 API 的原因有很多:
- 创建原型。有时你想要快速得到结果,一个原型,一个可以与同事讨论的东西。快速启动并运行某个东西,可以让你快速地对其进行修改,直到得到你想要的结果。
- 渐进式增强。您可能一开始并不需要所有“花哨”的功能,但随着时间的推移,您可能会需要它们。精简的 API 让您可以轻松地在需要时逐步添加所需的功能。
了解更多
查看这些关于学习使用最少 API 的学习模块
它与普通的 Web API 有何不同?
有一些区别:
- 文件更少。Startup.cs不再存在,只剩下Program.cs。
- 顶级语句和隐式全局使用。因为它使用了顶级语句,
using
并且namespace
也消失了,所以这段代码:
using System;
namespace Application
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
现在是这个代码:
Console.WriteLine("Hello World!");
- 路线您的路线不会映射到控制器类,而是使用
Map[VERB]
函数进行设置,就像您上面看到的那样,MapGet()
它采用路线和在命中该路线时要调用的函数。
您的第一个 API
要开始使用最小 API,您需要确保已安装 .NET 6,然后您可以通过命令行搭建 API,如下所示:
dotnet new web -o MyApi -f net6.0
一旦运行该程序,您将获得一个包含您的 API 的文件夹MyApi 。
您将在Program.cs中获得以下代码:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
app.Run();
要运行它,请输入dotnet run
。此处端口略有不同,它会默认使用一定范围内的随机端口,而不是您可能习惯的 5000/5001。不过,您可以根据需要配置端口。更多信息,请参阅此文档页面
解释各部分
好的,那么您有一个最小 API,代码是怎样的?
创建一个构建器
var builder = WebApplication.CreateBuilder(args);
在第一行,你创建一个builder
实例。它builder
有一个Services
属性,因此你可以在其上添加功能,例如 Swagger Cors、Entity Framework 等等。以下是一个设置 Swagger 功能的示例(不过需要安装 Swashbuckle NuGet 才能运行):
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Todo API", Description = "Keep track of your tasks", Version = "v1" });
});
创建应用程序实例
下一行如下:
var app = builder.Build();
这里我们创建了一个app
实例。通过该app
实例,我们可以执行以下操作:
- 启动应用程序,
app.Run()
- 配置路线,
app.MapGet()
- 配置中间件,
app.UseSwagger()
定义路线
使用以下代码配置路由和路由处理程序:
app.MapGet("/", () => "Hello World!");
该方法MapGet()
设置一条新路线,并将路线“/”和路线处理程序(一个函数)作为第二个参数() => "Hello World!"
。
启动应用程序
要启动应用程序并让其处理请求,您要做的最后一件事就是像这样调用实例Run()
:app
app.Run();
添加路线
要添加额外的路线,我们可以这样输入:
public record Pizza(int Id, string Name);
app.MapGet("/pizza", () => new Pizza(1, "Margherita"));
现在您的代码如下所示:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/pizza", () => new Pizza(1, "Margherita"));
app.MapGet("/", () => "Hello World!");
public record Pizza(int Id, string Name);
app.Run();
运行此代码并dotnet run
导航到/pizza
您将获得 JSON 响应的位置:
{
"pizza" : {
"id" : 1,
"name" : "Margherita"
}
}
示例应用程序
让我们把迄今为止学到的所有知识应用到一个支持 GET 和 POST 的应用程序中,并且还可以轻松展示如何使用查询参数:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var pizzas = new List<Pizza>(){
new Pizza(1, "Margherita"),
new Pizza(2, "Al Tonno"),
new Pizza(3, "Pineapple"),
new Pizza(4, "Meat meat meat")
};
app.MapGet("/", () => "Hello World!");
app.MapGet("/pizzas/{id}", (int id) => pizzas.SingleOrDefault(pizzas => pizzas.Id == id));
app.MapGet("/pizzas", (int ? page, int ? pageSize) => {
if(page.HasValue && pageSize.HasValue)
{
return pizzas.Skip((page.Value -1) * pageSize.Value).Take(pageSize.Value);
} else {
return pizzas;
}
});
app.MapPost("/pizza", (Pizza pizza) => pizzas.Add(pizza));
app.Run();
public record Pizza(int Id, string Name);
使用以下命令运行此应用程序dotnet run
在您的浏览器中,尝试各种操作,例如:
- “ http://localhost:{PORT}/pizzas ”,应该会返回所有披萨
- “ http://localhost:{PORT}/pizzas?page=1&pageSize=2 ”应该会返回前两个披萨。看看查询参数的效果如何。
- “ http://localhost:{PORT}/pizzas/2 ”,应该会返回“Al Tonno”披萨。这里匹配了
{id}
2,因此它会筛选出唯一匹配的商品。
了解更多
查看这些关于学习使用最少 API 的学习模块
鏂囩珷鏉ユ簮锛�https://dev.to/dotnet/get-started-with-minimal-api-1il7