日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Minimal API Todo Sample

發(fā)布時間:2023/12/4 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Minimal API Todo Sample 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Minimal API Todo Sample

Intro

.NET 6 Preview 4 開始引入了 Minimal API 到如今的 RC1,Minimal API 也完善了許多并且修復了很多BUG,之前也寫過文章介紹,可以參考:ASP.NET Core 6 Minimal API ,不過只是寫了一個 Hello World, 最早還要 Using 現(xiàn)在默認啟用了隱式命名空間可以不用在代碼里寫 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(); //?初始化數(shù)據(jù)庫 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 簡化的數(shù)據(jù)庫上下文注冊

我們可以使用 MapGet/MapPost/MapPut/MapDelete 來限制請求方法,可以使用 Results 來方便的返回 API 結果, 類似于在 Controller 里調用 Ok/BadRequest/NotFound 等方法

swagger 界面:

swagger ui

我們來測試一下需要認證的 Delete API, 前面我們注冊服務的時候使用了一個自定義的一個基于 query string 的認證方式以方便進行測試,下面我們來測試一下,首先需要調用 POST ?API 來創(chuàng)建一個 todo,然后調用 GET API 來確認一下 todo 創(chuàng)建成功了,之后就可以測試我們的 DELETE API 了

我這里使用之前開發(fā)的 dotnet-httpie(dotnet-HTTPie) 來進行測試,你也可以使用 Postman 或者別的工具來測試

首先執(zhí)行下面的命令

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

這里我們沒有提供任何的認證相關的信息,所以 API 返回了 401

接著我們提供認證信息來測試一下,在 query string 中添加 userId 和 userName 信息,執(zhí)行下面的命令

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"}

可以看到此時返回了 200,已經刪除成功了,不再是 401 了,我們也可以再調用一下?list?API 來看一下是否真的被刪除了,可以看到已經沒有元素返回了

對于創(chuàng)建一個新 todo 的 POST API 也可以使用?dotnet-httpie 來方便的請求

More

對于簡單的快速試錯的 API 推薦使用 Minimal API 來實現(xiàn),問題不大,但是比較復雜的應用個人還是推薦走 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 的使用,微軟專門做了一個文檔網(wǎng)站來介紹其使用,可以參考:https://minimal-apis.github.io/

另外微軟的大佬 David 在 Gist 上也有一篇關于 Minimal API 的總結,可以參考:https://gist.github.com/davidfowl/ff1addd02d239d2d26f4648a06158727

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 改造動態(tài)文件提供者

總結

以上是生活随笔為你收集整理的Minimal API Todo Sample的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。