Minimal API Todo Sample

Minimal API Todo Sample

Intro

.NET 6 Preview 4 开始引入了 Minimal API 到如今的 RC1,Minimal API 也完善了许多并且修复了很多BUG,之前也写过文章介绍,可以参考:ASP.NET Core 6 Minimal API ,不过只是写了一个 Hello World, 最早还要 Using 现在默认启用了隐式命名空间可以不用在代码里写 using 了,今天就来用 Minimal API 来写一个简单的增删改查的 Todo API,一起来看下面的示例吧

Sample

下面的这个小示例,除了基本的增删改查 API 还包含了 swagger 的配置、 EF Core 的使用以及认证授权

示例代码如下:

var builder = WebApplication.CreateBuilder(args);// 注册 DbContext
builder.Services.AddSqlite<TodoDbContext>(builder.Configuration.GetConnectionString("Todo"));
// 注册 swagger
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{c.SwaggerDoc("v1", new() { Title = "MinimalTodoAPI", Version = "v1" });
});
// 注册认证授权
builder.Services.AddAuthentication(QueryAuthenticationDefaults.AuthenticationSchema).AddQuery();
builder.Services.AddAuthorization();var app = builder.Build();
// 初始化数据库
using (var scope = app.Services.CreateScope())
{await scope.ServiceProvider.GetRequiredService<TodoDbContext>().Database.EnsureCreatedAsync();
}
// 配置 HTTP 请求管道
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MinimalTodoAPI v1"));
}
app.Map("/health", Results.Ok);
app.MapGet("/contextSample", (HttpContext context) =>{return Results.Ok(context.Request.Query);}).ExcludeFromDescription(); // 从 swagger 中排除此 API// Todo 的增删改查 API
app.MapGet("/api/todo", (TodoDbContext dbContext) => dbContext.TodoItems.AsNoTracking().ToArrayAsync());
app.MapPost("/api/todo", async (TodoItem item, TodoDbContext dbContext) => 
{if(string.IsNullOrWhiteSpace(item?.Title)){return Results.BadRequest();}item.Id = 0;item.CreatedAt = DateTime.UtcNow;dbContext.TodoItems.Add(item);await dbContext.SaveChangesAsync();return Results.Created($"/api/todo/{item.Id}", item);
});
app.MapPut("/api/todo/{id}", async (int id, TodoItem item, TodoDbContext dbContext) => 
{if(id <= 0 || string.IsNullOrWhiteSpace(item?.Title)){return Results.BadRequest();}var todo = await dbContext.TodoItems.FindAsync(id);if(todo is null){return Results.NotFound();}todo.Title = item.Title;todo.Description = item.Description;todo.Done = item.Done;await dbContext.SaveChangesAsync();return Results.Ok(todo);
});// 认证授权 
app.UseAuthentication();
app.UseAuthorization();app.MapDelete("/api/todo/{id}", async (int id, TodoDbContext dbContext) =>
{if (id <= 0){return Results.BadRequest();}var todo = await dbContext.TodoItems.FindAsync(id);if (todo is null){return Results.NotFound();}dbContext.Remove(todo);await dbContext.SaveChangesAsync();return Results.Ok(todo);
}).RequireAuthorization();app.Run();

上面示例注册 EF Core DbContext 的时候用的上次我们介绍的简化后的注册方式 EF Core 6 简化的数据库上下文注册

我们可以使用 MapGet/MapPost/MapPut/MapDelete 来限制请求方法,可以使用 Results 来方便的返回 API 结果, 类似于在 Controller 里调用 Ok/BadRequest/NotFound 等方法

swagger 界面:

29659a0ce82a68bce057989efac6679c.png

swagger ui

我们来测试一下需要认证的 Delete API, 前面我们注册服务的时候使用了一个自定义的一个基于 query string 的认证方式以方便进行测试,下面我们来测试一下,首先需要调用 POST  API 来创建一个 todo,然后调用 GET API 来确认一下 todo 创建成功了,之后就可以测试我们的 DELETE API 了

5f3b5a8702f4a4819cbdc51fe28ef380.png

我这里使用之前开发的 dotnet-httpie(dotnet-HTTPie) 来进行测试,你也可以使用 Postman 或者别的工具来测试

首先执行下面的命令

http delete -v --schema=https :7229/api/todo/1

HTTP 请求响应信息如下:

DELETE /api/todo/1 HTTP/1.1
Host: localhost:7229
Schema: https
User-Agent: dotnet-HTTPie/0.1.1HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Sun, 19 Sep 2021 15:59:19 GMT
Server: Kestrel

d0b9c9531fecd1f2278c1d3f2b5e1db5.png

这里我们没有提供任何的认证相关的信息,所以 API 返回了 401

接着我们提供认证信息来测试一下,在 query string 中添加 userId 和 userName 信息,执行下面的命令

http delete -v --schema=https :7229/api/todo/1 userId==1 userName==test

HTTP 请求响应信息如下:

DELETE /api/todo/1?userId=1&userName=test HTTP/1.1
Host: localhost:7229
Schema: https
User-Agent: dotnet-HTTPie/0.1.1HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Date: Sun, 19 Sep 2021 16:04:29 GMT
Server: Kestrel
Transfer-Encoding: chunked{"id":1,"title":"test","description":"test","done":false,"createdAt":"2021-09-19T15:57:31.3370653"}

14dd32596c97ec8710146f36f1173744.png

可以看到此时返回了 200,已经删除成功了,不再是 401 了,我们也可以再调用一下 list API 来看一下是否真的被删除了,可以看到已经没有元素返回了

6925afc99b4099fa55255a1568fe0279.png

对于创建一个新 todo 的 POST API 也可以使用 dotnet-httpie 来方便的请求

d033ffac44d7db8ee116413a79893bd5.png

More

对于简单的快速试错的 API 推荐使用 Minimal API 来实现,问题不大,但是比较复杂的应用个人还是推荐走 MVC/Web API 的形式,更为成熟,功能更全面,Minimal API 很多功能不支持或者支持的不太好,比如说 Minimal API 是不支持对 model 进行验证的,是没有 ModelState 的,即使 model 里声明了 Required 等验证,在 Minimal API 里也是不起作用的,也不支持 API-Version,另外对于 API 的分组支持也是比较弱的,要自己指定 tag 去分组,不如使用 Controller 简单方便

上面的源码可以在 Github 上获取 https://github.com/WeihanLi/SamplesInPractice/tree/master/net6sample/MinimalTodoAPI

对于 Minimal API 的使用,微软专门做了一个文档网站来介绍其使用,可以参考:https://minimal-apis.github.io/

0d42a59b16530eac9e98f9724c36018c.png

5263c149fed76db6b0731373e71854dc.png

另外微软的大佬 David 在 Gist 上也有一篇关于 Minimal API 的总结,可以参考:https://gist.github.com/davidfowl/ff1addd02d239d2d26f4648a06158727

f1ef94869fb7034801b69137cbc3215e.png

f306895735ebd608f20718f855a784ce.png

References

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/net6sample/MinimalTodoAPI

  • https://github.com/Minimal-APIs/minimal-apis.github.io

  • https://minimal-apis.github.io/

  • https://gist.github.com/davidfowl/ff1addd02d239d2d26f4648a06158727

  • ASP.NET Core 6 Minimal API

  • 使用 Minimal API 改造动态文件提供者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297930.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF基础到企业应用系列7——深入剖析依赖属性(三)

八. 只读依赖属性 我们以前在对简单属性的封装中&#xff0c;经常会对那些希望暴露给外界只读操作的字段封装成只读属性&#xff0c;同样在WPF中也提供了只读属性的概念&#xff0c;如一些 WPF控件的依赖属性是只读的&#xff0c;它们经常用于报告控件的状态和信息&#xff0c;…

Web的结构组件

位于Web浏览器与Web服务器之间还有一些用于帮助他们进行事物处理的应用程序&#xff0c;如下所示。 代理 代理位于客户端和服务器之间&#xff0c;接受所有客户端的HTTP请求&#xff0c;并将这些请求转发给服务器。 缓存 Web缓存或代理缓存是一种特殊HTTP代理服务器&#xff0c…

从没想过从上帝视角看地球,竟美得如此震撼!

全世界只有3.14 % 的人关注了爆炸吧知识“ 当你从另一个角度俯瞰地球&#xff0c;你就能发现不一样的世界 。。。试想你现在飘起来了飘得越来越高&#xff0c;地球在你眼里慢慢变小现在&#xff0c;你看见的是此生从未见过的景色——《极简宇宙史》当想象力带我走向未知脑海…

双目三维重建_【光电视界】简单介绍双目视觉三维重构

今日光电有人说&#xff0c;20世纪是电的世纪&#xff0c;21世纪是光的世纪&#xff1b;知光解电&#xff0c;再小的个体都可以被赋能。欢迎来到今日光电&#xff01;----与智者为伍 为创新赋能----1、三维重构1.1、三维重构到底是什么&#xff1f;首先要了解立体匹配算法&…

mendelay为什么安装不了_你为什么消防验收过不了?消防管道安装错误图集

来源&#xff1a;水电工论坛如有侵权&#xff0c;请联系删除消防管道安装如果一次没做好&#xff0c;验收不通过的话重新返工将对工程进度造成很大的影响&#xff0c;所以在施工时一定要注意以下的错误一定不能出现。2个沟槽卡箍间管段未设置支架立管角钢支架安装时应平面朝上管…

.NET 6 中的HTTP 3支持

dotnet团队官方博客发布了一篇HTTP3的文章&#xff1a;HTTP/3 support in .NET 6&#xff1a;https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/。文章介绍了.NET 6 将预览支持HTTP3&#xff0c;.NET 7正式支持HTTP3&#xff0c;原因主要是HTTP/3 的 RFC 尚未…

Lock与synchronized 的区别

2019独角兽企业重金招聘Python工程师标准>>> 多次思考过这个问题&#xff0c;都没有形成理论&#xff0c;今天有时间了&#xff0c;我把他总结出来&#xff0c;希望对大家有所帮助 1、ReentrantLock 拥有Synchronized相同的并发性和内存语义&#xff0c;此外还多了 …

linux 内核 三天吐血,编译安装——吐血经验,内附脚本

程序包编译安装&#xff1a;源码包&#xff1a;name-VERSION-release.src.rpmrpm由源码包安装后&#xff0c;使用rpmbuild命令制作成二进制格式的rpm包&#xff0c;而后再安装源代码–> 预处理–> 编译(gcc)–> 汇编–> 链接–> 执行源代码组织格式&#xff1a;…

mac编辑器coda使用小贴条

前言&#xff1a;最近用mac开发环境了&#xff0c;自然一天到晚用coda&#xff0c;可总是有不顺的地方&#xff0c;搜到这篇文章感觉像看到了知音人&#xff0c;实在是解决了我不少疑难问题啊。外文针对的coda版本较低&#xff0c;我总结的针对版本是version1.7.3 coda快捷键操…

我在 GitHub 上发现了一款骚气满满的字体!

全世界只有3.14 % 的人关注了爆炸吧知识转自&#xff1a;量子位&#xff0c;作者&#xff1a;栗体这个字体叫 Leon Sans&#xff0c;表面看去平平无奇。但事实上&#xff0c;它并不是普通的字体&#xff0c;体内蕴藏着魔力。Leon Sans 最特别的地方在于&#xff0c;字体是由代码…

PHP 接收 UDP包_php只能做网站?基于swoole+websocket开发双向通信应用

前言众所周知&#xff0c;PHP用于开发基于HTTP协议的网站应用非常便捷。而HTTP协议是一种单向的通信协议&#xff0c;只能接收客户端的请求&#xff0c;然后响应请求&#xff0c;不能主动向客户端推送信息。因此&#xff0c;一些实时性要求比较高的应用&#xff0c;如实时聊天、…

WPF 实现火炬效果

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览02—代码如下一、FireControl.cs 代码如下using System; using System.Collections.Generic; using System.Linq; using System.Tex…

08 comet反向ajax

一&#xff1a;HTTP协议与技久链接分块传输---->反向ajax 反向ajax又叫comet, server push,服务器推技术. 应用范围: 网页聊天服务器,, 新浪微博在线聊天,google mail 网页聊天,都有用到. 原理: 一般而言, HTTP协议的特点, 连接<->断开. 具体什么时间断开? 服务器响应…

男朋友出的性格测试题

1 一家人出去玩了三天&#xff0c;把猫忘在家里了&#xff01;2 嗷呜3 竟然毫无违和感4 叫你一声造句鬼才不过分吧5 秋天原来是这样来的嘛~6 当代嗑cp网友现状5 现在的年轻人都哪里学来的这么多招数内容自沙雕男友的日常你点的每个赞&#xff0c;我都认真当成了喜欢

linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...

本文介绍如何在Linux操作系统中设置或更改时区的方法&#xff0c;可以使用timedatectl&#xff0c;包括通过创建符号链接来更改时区。前言时区是具有相同标准时间的地理区域&#xff0c;通常&#xff0c;时区是在操作系统的安装过程中设置的&#xff0c;但以后可以轻松更改。对…

mapbox 导航_狂甩不掉,骑行最稳手机支架!一体式安装太方便,秒变单车导航仪...

发对于骑行爱好者而言&#xff0c;对手机支架的稳固性有很高的要求&#xff0c;同时支架体积不能太大&#xff0c;对手机本身也要有一定的保护性&#xff0c;手机安放好&#xff0c;骑行才能更自在&#xff01;一个舒适的手机支架&#xff0c;对于业务繁忙或者像小渣一样的路痴…

Docker小白到实战之Docker网络简单了解一下

前言现在对于Docker容器的隔离性都有所了解了&#xff0c;但对容器IP地址的分配、容器间的访问等还是有点小疑问&#xff0c;如果容器的IP由于新启动导致变动&#xff0c;那又怎么才能保证原有业务不会被影响&#xff0c;这就和网络有挂钩了&#xff0c;接下来就大概说说。正文…

^_^家园游记^_^

j 你梦想中的家是怎么家的呢&#xff1f; 是鲁宾逊漂流记中那样&#xff1a;一个荒岛&#xff0c;一片青山绿水的悠闲自在&#xff1f; 还是让人流连忘返的色彩斑斓&#xff0c;鳞次栉比&#xff0c;浓浓的欧式典雅&#xff1f; 或是奔放自由的乡村田园&#xff0c;精…

sigar如何获取linux的buffer内存,Linux 下使用Sigar 获取内存信息

上一篇文章介绍了linux下的sigar 库,并使用sigar 库来获取cpu 使用率,本文在这里介绍一下如何使用sigar 库获取内存信息.和cpu 一样,sigar中有和内存相关的结构体sigar_mem_t,我们来看一下结构体原型:typedef struct {sigar_uint64_tram,total,used,free,actual_used,actual_fr…

如何将手机投屏到电脑_手机如何投屏到电脑上?详细教程看这里,手机投屏

手机再大的屏幕&#xff0c;也没有手机投屏到电脑、电视的体验爽。那么哪款投屏软件好用&#xff1f;又如何使用呢&#xff1f;下面小编给大家介绍下金舟苹果手机投屏软件&#xff0c;一起来看看如何将手机投屏到电脑上&#xff0c;详细步骤如下。第一步、首先&#xff0c;在电…