ASP.NET Core 最小 API:極簡開發,高效構建(上)

一、概述

構建最小 API,以創建具有最小依賴項的 HTTP API。 它們非常適合于需要在 ASP.NET Core 中僅包括最少文件、功能和依賴項的微服務和應用。 本文介紹使用 ASP.NET Core 生成最小 API 的基礎知識,將創建以下 API:

API(應用程序接口)描述請求正文響應正文
GET /todoitems獲取所有待辦事項待辦事項的數組
GET /todoitems/complete獲取已完成的待辦事項待辦事項的數組
GET /todoitems/{id}按 ID 獲取項待辦事項
POST /todoitems添加新項待辦事項待辦事項
PUT /todoitems/{id}更新現有項待辦事項
DELETE /todoitems/{id}刪除項

二、開發環境

Deepin 20.9、.Net Core 8、VS Code

開發環境搭建參考:.NET SDK 各操作系統開發環境搭建

三、創建 TodoApi 項目

創建一個空模板項目,

在這里插入圖片描述

在這里插入圖片描述

Program.cs 文件包含以下代碼:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();app.MapGet("/", () => "Hello World!");app.Run();

前面的代碼:

  • 創建具有預配置默認值的 WebApplicationBuilderWebApplication
  • 創建返回 / 的 HTTP GET 終結點 Hello World!

在這里插入圖片描述

運行項目后,瀏覽器訪問 http://localhost:5026Hello World! 將顯示在瀏覽器中。Program.cs 文件包含了一個最小但完整的應用。

在這里插入圖片描述

四、添加 NuGet 包

需要添加 ORM 框架 EF CORE,搜索 Microsoft.EntityFrameworkCore.InMemory,然后安裝,

在這里插入圖片描述

安裝完成,

在這里插入圖片描述

除此之外,還需要安裝 Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore 用于捕獲異常,注意版本要適配 SDK,不然會報錯rror CS1061: “IServiceCollection”未包含“AddDatabaseDeveloperPageExceptionFilter”的定義,并且找不到可接受第一個“IServiceCollection”類型參數的可訪問擴展方法“AddDatabaseDeveloperPageExceptionFilter”(是否缺少 using 指令或程序集引用?)

在這里插入圖片描述

在這里插入圖片描述

五、模型和數據庫上下文類

在項目文件夾中,創建名為 Todo.cs 的文件為此應用創建模型,包含以下代碼:

namespace TodoApi;public class Todo
{public int Id { get; set; }public string? Name { get; set; }public bool IsComplete { get; set; }
}

該模型是一個表示應用管理的數據的類。

接著創建名為 TodoDb.cs 的文件定義數據庫上下文,它是為數據模型協調實體框架功能的主類, 此類從 Microsoft.EntityFrameworkCore.DbContext 類派生,包含以下代碼:

namespace TodoApi;using Microsoft.EntityFrameworkCore;class TodoDb : DbContext
{public TodoDb(DbContextOptions<TodoDb> options): base(options) { }public DbSet<Todo> Todos => Set<Todo>();
}

六、添加 API 代碼

Program.cs 文件的內容替換為以下代碼:

using Microsoft.EntityFrameworkCore;using TodoApi;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TodoDb>(opt => opt.UseInMemoryDatabase("TodoList"));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();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.NoContent();}return Results.NotFound();
});app.Run();

其中,以下這個代碼段將數據庫上下文添加到依賴關系注入 (DI) 容器,并且允許顯示與數據庫相關的異常:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TodoDb>(opt => opt.UseInMemoryDatabase("TodoList"));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();

DI 容器提供對數據庫上下文和其他服務的訪問權限。

七、使用 Swagger 創建 API 測試 UI

.NET 包 NSwag.AspNetCore 集成了 Swagger 工具,可用于生成遵循 OpenAPI 規范的測試 UI:

  • NSwag:將 Swagger 直接集成到 ASP.NET Core 應用程序中的 .NET 庫,提供了中間件和配置。
  • Swagger:一組開放源代碼工具(如 OpenAPIGenerator 和 SwaggerUI),用于生成遵循 OpenAPI 規范的 API 測試頁。
  • OpenAPI 規范:基于控制器和模型中的 XML 和屬性注釋,描述 API 功能的文檔。

在這里插入圖片描述

安裝 Swagger 工具之后,配置 Swagger 中間件:

using Microsoft.EntityFrameworkCore;
using NSwag.AspNetCore;
using TodoApi;var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TodoDb>(opt => opt.UseInMemoryDatabase("TodoList"));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();builder.Services.AddEndpointsApiExplorer();
builder.Services.AddOpenApiDocument(config =>
{config.DocumentName = "TodoAPI";config.Title = "TodoAPI v1";config.Version = "v1";
});
var app = builder.Build();

在前面的代碼中:

  • builder.Services.AddEndpointsApiExplorer();:啟用 API 資源管理器,該服務提供有關 HTTP API 的元數據。 該 API 資源管理器由 Swagger 用于生成 Swagger 文檔。

  • builder.Services.AddOpenApiDocument(config => {...});:將 Swagger OpenAPI 文檔生成器添加到應用程序服務,并配置它以提供有關 API 的詳細信息,例如其標題和版本。

在 app 行中定義 var app = builder.Build(); 后,添加代碼:

var app = builder.Build();
if (app.Environment.IsDevelopment())
{app.UseOpenApi();app.UseSwaggerUi(config =>{config.DocumentTitle = "TodoAPI";config.Path = "/swagger";config.DocumentPath = "/swagger/{documentName}/swagger.json";config.DocExpansion = "list";});
}

通過前面的代碼,Swagger 中間件可以為生成的 JSON 文檔和 Swagger UI 提供服務。 Swagger 僅在開發環境中啟用。 在生產環境中啟用 Swagger 可能會公開有關 API 結構和實現的潛在敏感詳細信息。

八、測試發布數據

Program.cs 中的以下代碼創建 HTTP POST 終結點 /todoitems 以將數據添加到內存中數據庫:

app.MapPost("/todoitems", async (Todo todo, TodoDb db) =>
{db.Todos.Add(todo);await db.SaveChangesAsync();return Results.Created($"/todoitems/{todo.Id}", todo);
});

運行應用。 瀏覽器顯示 404 錯誤,因為不再存在 / 終結點。訪問 http://localhost:5026/swagger/index.html 可以看到 Swagger 文檔 UI,

在這里插入圖片描述

選擇 Post /todoitems 接口進行測試,

在這里插入圖片描述

在這里插入圖片描述

新增數據后,我們通過調用 Get todoitems 接口查詢結果,

在這里插入圖片描述

參考文檔

  • 教程:使用 ASP.NET Core 創建最小 API

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77521.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apache Parquet 文件組織結構

簡要概述 Apache Parquet 是一個開源、列式存儲文件格式&#xff0c;最初由 Twitter 與 Cloudera 聯合開發&#xff0c;旨在提供高效的壓縮與編碼方案以支持大規模復雜數據的快速分析與處理。Parquet 文件采用分離式元數據設計 —— 在數據寫入完成后&#xff0c;再追加文件級…

IntelliJ IDEA 2025.1 發布 ,默認 K2 模式 | Android Studio 也將跟進

2025.1 版本已經發布&#xff0c;在此之前我們就聊過該版本的 《Terminal 又發布全新重構版本》&#xff0c;而現在 2025.1 中的 K2 模式也成為了默認選項。 可以預見&#xff0c;這個版本可能會包含不少大坑&#xff0c;為下個 Android Studio 祈禱。 首先有一點可以確定&…

云效部署實現Java項目自動化部署圖解

前言 記錄下使用云效部署Java項目&#xff0c;實現java項目一鍵化自動化部署。 云效流程說明&#xff1a; 1.云效拉取最新git代碼后 2.進行maven編譯打包后&#xff0c;上傳到指定服務器目錄 3.通過shell腳本&#xff0c;先kill java項目后&#xff0c;通過java -jar 啟動項…

國際數據加密算法(IDEA)詳解

以下是修正后的準確版本,已解決原文中的術語、符號及技術細節問題: ?國際數據加密算法(IDEA)? IDEA是一種分組加密算法,由Xuejia Lai(來學嘉)和James Massey于1990年設計。IDEA使用128位密鑰對64位明文分組進行加密,經過8輪迭代運算后生成64位密文分組。其安全性基于…

TensorFlow介紹

TensorFlow 是由 Google 開發 的開源機器學習框架&#xff0c;主要用于構建、訓練和部署機器學習模型。它支持深度學習、傳統機器學習和數值計算&#xff0c;適用于圖像識別、自然語言處理&#xff08;NLP&#xff09;、推薦系統、強化學習等多種任務。 核心特性 基于 數據流…

百級Function架構集成DeepSeek實踐:Go語言超大規模AI工具系統設計

一、百級Function系統的核心挑戰 1.1 代碼結構問題 代碼膨脹現象&#xff1a;單個文件超過2000行代碼路由邏輯復雜&#xff1a;巨型switch-case結構維護困難依賴管理失控&#xff1a;跨Function依賴難以追蹤 // 傳統實現方式的問題示例 switch functionName { case "fu…

嵌入式芯片中的 SRAM 內容細講

什么是 RAM&#xff1f; RAM 指的是“隨機存取”&#xff0c;意思是存儲單元都可以在相同的時間內被讀寫&#xff0c;和“順序訪問”&#xff08;如磁帶&#xff09;相對。 RAM 不等于 DRAM&#xff0c;而是一類統稱&#xff0c;包括 SRAM 和 DRAM 兩種主要類型。 靜態隨機存…

標準的JNI (Java Native Interface) 加載函數 JNI_OnLoad

1.JNI_OnLoad 在 Android Native 開發中&#xff0c;JNI_OnLoad 是動態注冊本地方法的標準入口點。以下是一個標準實現示例及其說明&#xff1a; JNI_OnLoad 標準實現 #include <jni.h> #include <string>// 聲明本地方法對應的 C/C 函數 jint native_add(JNIEnv…

算法導論思考題

2-1 在歸并排序中對小數組采用插入排序 c. 假定修改后的算法的最壞情況運行時間為 Θ \Theta Θ(nknlg(n/k))&#xff0c;要使修改后的算法與標準的歸并排序具有相同的運行時間&#xff0c;作為n的一個函數&#xff0c;借助 Θ \Theta Θ記號&#xff0c;k的最大值是什么&#…

JavaScript 性能優化

JavaScript 性能優化是提高 Web 應用性能的關鍵步驟,特別是在處理大量數據、復雜計算或頻繁的 DOM 操作時。以下是一些常見的 JavaScript 性能優化技巧和策略: 文章目錄 @[TOC]一、代碼層面優化1. **減少全局變量**2. **避免使用 `with` 語句**3. **使用局部變量**4. **減少 …

NLP高頻面試題(四十七)——探討Transformer中的注意力機制:MHA、MQA與GQA

MHA、MQA和GQA基本概念與區別 1. 多頭注意力(MHA) 多頭注意力(Multi-Head Attention,MHA)通過多個獨立的注意力頭同時處理信息,每個頭有各自的鍵(Key)、查詢(Query)和值(Value)。這種機制允許模型并行關注不同的子空間上下文信息,捕捉復雜的交互關系。然而,MHA…

51單片機的原理圖和PCB繪制

51單片機最小系統原理圖 加了兩個led燈和按鍵檢測電路。 PCB中原件擺放位置 成品 資源鏈接&#xff1a;https://download.csdn.net/download/qq_61556106/90656365

使用注解方式整合ssm時,啟動tomcat掃描不到resource下面的xxxmapper.xml

解決org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xxx.mapper.方法 在Spring與Mybatis整合時&#xff0c;可能會遇到這樣的報錯 原因&#xff1a; 其原因為mapper路徑的映射錯誤&#xff0c;表示在嘗試執行某個 Mapper 接口的方法時…

提示詞設計:動態提示詞 標準提示詞

提示詞設計:動態提示詞 標準提示詞 研究背景:隨著人工智能與司法結合的推進以及裁判文書公開數量增多,司法摘要任務愈發重要。傳統司法摘要方法生成質量有待提升,大語言模型雖有優勢,但處理裁判文書時存在摘要結構信息缺失、與原文不一致等問題。研究方法 DPCM方法:分為大…

Jenkins 多分支管道

如果您正在尋找一個基于拉取請求或分支的自動化 Jenkins 持續集成和交付 (CI/CD) 流水線&#xff0c;本指南將幫助您全面了解如何使用 Jenkins 多分支流水線實現它。 Jenkins 的多分支流水線是設計 CI/CD 工作流的最佳方式之一&#xff0c;因為它完全基于 git&#xff08;源代…

跨境電商管理轉型:日事清通過目標管理、流程自動化助力智優美科技項目管理升級與目標落地復盤

1.客戶背景介紹 深圳市智優美科技有限公司是一家專業從事外貿B2C的電子商務公司&#xff0c;公司總部位于深圳市寶安區&#xff0c;旗下擁有三家子公司。目前銷售的品類有&#xff1a;家居用品、電子產品、電子配件產品等&#xff0c;在深圳外貿電商行業銷售額穩居行業前10名。…

基于Docker+k8s集群的web應用部署與監控

項目架構圖 server ip master 192.168.140.130 node1 192.168.140.131 node2 192.168.140.132 ansible 192.168.140.166 jumpserver 192.168.100.133 firewall 192.168.1.86 nfs 192.168.140.157 harbor 192.168.140.159 Promethethus 192.168.140.130 Jen…

量子計算與經典計算融合:開啟計算新時代

一、引言 隨著科技的飛速發展&#xff0c;計算技術正迎來一場前所未有的變革。量子計算作為前沿技術&#xff0c;以其強大的并行計算能力和對復雜問題的高效處理能力&#xff0c;吸引了全球科技界的關注。然而&#xff0c;量子計算并非要完全取代經典計算&#xff0c;而是與經典…

【HarmonyOS 5】makeObserved接口詳解

【HarmonyOS 5】makeObserved接口詳解 一、makeObserved接口是什么&#xff1f; makeObserved 接口&#xff08;API version 12 起可用&#xff09;用于將非觀察數據轉為可觀察數據&#xff0c;適用于三方包類、Sendable 裝飾的類、JSON.parse 返回的對象、collections.Array…

豆瓣圖書數據采集與可視化分析(二)- 豆瓣圖書數據清洗與處理

文章目錄 前言一、查看數據基本信息二、拆分pub列三、日期列處理四、價格列處理五、出版社列處理六、評價人數列處理七、缺失值處理八、重復數據處理九、異常值處理十、完整代碼十一、清洗與處理后的數據集展示 前言 豆瓣作為國內知名的文化社區&#xff0c;擁有龐大且豐富的圖…