.NET 6.0 教程中的 Web API:如何構(gòu)建 CRUD 操作

言鼎科技 2023-06-11 353

介紹

在本教程中,我們將構(gòu)建使用實(shí)體框架核心和 SQL 來(lái)創(chuàng)建 API 端點(diǎn)的 .NET 6 Web API。它將允許客戶(hù)端在 API 中對(duì)存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)執(zhí)行 CRUD 操作。

在我們的演示應(yīng)用程序中,我們將使用數(shù)據(jù)庫(kù)優(yōu)先方法。我們將從在 SQL 數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)表開(kāi)始,然后使用一個(gè)實(shí)體框架來(lái)創(chuàng)建 DBContext 和模型。

什么是網(wǎng)絡(luò) API?

Web API 或應(yīng)用程序編程接口是一個(gè)平臺(tái),旨在開(kāi)發(fā)可由各種客戶(hù)端應(yīng)用程序(如移動(dòng)設(shè)備、Web 瀏覽器和桌面應(yīng)用程序)訪(fǎng)問(wèn)的 HTTP 服務(wù)。它充當(dāng)多個(gè)應(yīng)用程序交換數(shù)據(jù)和相互交互的媒介。開(kāi)發(fā)人員可以創(chuàng)建可通過(guò) HTTP 調(diào)用 API 請(qǐng)求的函數(shù)。此功能允許您為客戶(hù)保存或檢索數(shù)據(jù),使他們能夠執(zhí)行某些任務(wù)并訪(fǎng)問(wèn)通過(guò) API 提供給他們的特定信息。

API的主要特點(diǎn)

  • 支持 GET、POST、PUT、DELETE 等 HTTP 動(dòng)詞,允許客戶(hù)端對(duì)數(shù)據(jù)執(zhí)行不同的操作

  • 支持默認(rèn)響應(yīng),例如 XML 和 JSON,這些標(biāo)準(zhǔn)格式有助于在客戶(hù)端和服務(wù)器之間交換數(shù)據(jù)。

  • API 可以定義自定義數(shù)據(jù),允許您根據(jù)客戶(hù)要求定制數(shù)據(jù)

  • API 可以自行托管或由第三方托管,這意味著您可以靈活地使用它們。

  • 它允許輕松授權(quán)和身份驗(yàn)證,這有助于控制對(duì) API crud 操作的訪(fǎng)問(wèn)并保護(hù)您的數(shù)據(jù)。

  • API 是構(gòu)建 RESTful 服務(wù)的理想平臺(tái),用于設(shè)計(jì)可擴(kuò)展、靈活且易于維護(hù)的 Web 服務(wù)。

為什么我們需要 Web API?

現(xiàn)在人們使用多種設(shè)備,例如智能手機(jī)、平板電腦和 iPhone;因此,要覆蓋所有用戶(hù),需要的不僅僅是基于網(wǎng)絡(luò)的應(yīng)用程序。我們需要一個(gè) API 來(lái)將所有這些服務(wù)數(shù)據(jù)公開(kāi)給所有不同的設(shè)備應(yīng)用程序和瀏覽器。加入一個(gè)web API項(xiàng)目可以更容易地橋接兩端,更容易管理和更新。

在這種情況下,我們需要一個(gè) Web API 來(lái)管理網(wǎng)站、Android 應(yīng)用程序和 iOS 應(yīng)用程序之間的數(shù)據(jù)庫(kù)交互和業(yè)務(wù)邏輯。

所有三個(gè)應(yīng)用程序都可以通過(guò) Web API 項(xiàng)目與數(shù)據(jù)庫(kù)通信,該項(xiàng)目處理所有數(shù)據(jù)庫(kù)交互并確保無(wú)法通過(guò)網(wǎng)站或應(yīng)用程序直接訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。

通過(guò)使用 Web API,我們可以確保不同應(yīng)用程序和設(shè)備之間安全高效的通信,使其成為現(xiàn)代應(yīng)用程序開(kāi)發(fā)中必不可少的工具。

.NET 6 中有哪些新功能?

讓我們來(lái)看看一些主要亮點(diǎn)。

  • 熱重載允許開(kāi)發(fā)人員在應(yīng)用程序仍在運(yùn)行時(shí)修改用戶(hù)界面。更改會(huì)實(shí)時(shí)反映出來(lái),無(wú)需重新構(gòu)建或啟動(dòng)應(yīng)用程序。

  • 使用 Startup 或 Program 類(lèi)中“EndpointConcentionBuilder”的擴(kuò)展方法,開(kāi)發(fā)人員無(wú)需模板或控制器即可構(gòu)建輕量級(jí)服務(wù)的最小 API 。

  • HTTP 日志記錄中間件可以記錄 HTTP 請(qǐng)求和響應(yīng)信息,如標(biāo)頭、正文和屬性,以增強(qiáng)調(diào)試和監(jiān)控

  • 用于使用 c# 構(gòu)建交互式 Web 應(yīng)用程序的Blazor Web 框架改進(jìn)了性能、事件綁定和對(duì)預(yù)呈現(xiàn)組件的支持。

  • ASP.NET Core 程序和 Startup 類(lèi)合并,簡(jiǎn)化了代碼結(jié)構(gòu)。

  • 通過(guò)與 Kubernetes 和其他云平臺(tái)的集成支持云原生開(kāi)發(fā)。

  • 通過(guò)引入新的源生成器增強(qiáng) JSON 支持

  • .NET Core 現(xiàn)在改進(jìn)了對(duì) gRPC 和 GraphQL API 的支持。
    OpenSSL 3 的使用和對(duì)運(yùn)行時(shí)縱深防御緩解措施的支持增強(qiáng)了 .NET 核心的安全性。

  • 在 Windows、macOS 和 Linux 上支持無(wú)需提取的單文件應(yīng)用程序。

  • 重寫(xiě)的 FileStream 提高了 I/O 操作的性能,尤其是文件 I/O。

  • 使用新的源代碼生成器框架改進(jìn)了源代碼生成。

  • 改進(jìn)的 .NET MAUI(多平臺(tái)應(yīng)用程序用戶(hù)界面)支持構(gòu)建跨平臺(tái)移動(dòng)和桌面應(yīng)用程序。

  • 對(duì) .NET 運(yùn)行時(shí)的改進(jìn)包括增強(qiáng)的垃圾收集、改進(jìn)的基于 ARM 的平臺(tái)性能和硬件內(nèi)在支持。

  • Entity Framework Core改進(jìn)了對(duì) Cosmos DB 的支持和用于查詢(xún)嵌套 JSON 數(shù)據(jù)的新 LINQ 語(yǔ)法。

  • Visual Studio 工具已通過(guò)新項(xiàng)目模板和與 GitHub 的集成得到改進(jìn)。

先決條件:.NET 6.0 中的 Web API

  • 視覺(jué)工作室 2022。

  • .NET SDK 6.0。

  • SQL服務(wù)器。

    • 創(chuàng)建項(xiàng)目

      啟動(dòng) Visual Studio 并創(chuàng)建一個(gè)類(lèi)型為ASP.NET Core Web API的新項(xiàng)目,然后單擊下一步。輸入項(xiàng)目名稱(chēng)ProductCrudAPI,選擇要保存項(xiàng)目的位置,然后單擊下一步。選擇.Net 6.0(長(zhǎng)期支持)作為框架。如下圖所示填寫(xiě)所需信息,然后單擊“創(chuàng)建”。單擊創(chuàng)建后,將創(chuàng)建一個(gè) Web API 項(xiàng)目。添加 NuGet 包

      要在我們的項(xiàng)目中使用實(shí)體框架核心,我們需要安裝兩個(gè) NuGet 包:

      • Microsoft.EntityFrameworkCore.工具

      • Microsoft.EntityFrameworkCore.SqlServer

        • 按照以下說(shuō)明安裝NuGet 包。
          右鍵單擊依賴(lài)項(xiàng)并選擇管理 NuGet 包。
          Microsoft.EntityFrameworkCore.Tools

          選擇瀏覽選項(xiàng)卡并搜索Microsoft.EntityFrameworkCore.Tools并安裝其最新的穩(wěn)定版本。Microsoft.EntityFrameworkCore.SqlServer

          安裝上述包后,搜索Microsoft.EntityFrameworkCore.SqlServer并安裝其最新的穩(wěn)定版本。創(chuàng)建 SQL 數(shù)據(jù)庫(kù)和表。

          轉(zhuǎn)到 .NET 6.0 教程中 Web API 的下一部分,在 SQL 中創(chuàng)建新數(shù)據(jù)庫(kù)ProductDB,并執(zhí)行以下腳本來(lái)創(chuàng)建Product表。

          使用 [產(chǎn)品數(shù)據(jù)庫(kù)]去設(shè)置 ANSI_NULLS去設(shè)置 QUOTED_IDENTIFIER ON去創(chuàng)建表 [dbo].[產(chǎn)品](
          [Id] [int] IDENTITY(1,1) NOT NULL,
          [名稱(chēng)] [varchar](50) 不為空,
          [說(shuō)明] [varchar](250) NULL,
          [價(jià)格] [十進(jìn)制](18, 2) NOT NULL,主鍵集群(
          [編號(hào)] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]) 在 [主要]去

          創(chuàng)建數(shù)據(jù)庫(kù)上下文和模型

          現(xiàn)在,讓我們繼續(xù)我們的 Web API 教程的下一步,我們將在其中創(chuàng)建 DBContext 和模型。

          我們正在使用實(shí)體框架的數(shù)據(jù)庫(kù)優(yōu)先方法。
          我們已經(jīng)創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù)表,并使用了實(shí)體框架的Scaffold-DbContext命令;我們將在 C# 項(xiàng)目中創(chuàng)建所需的類(lèi)。

          打開(kāi)包管理器控制臺(tái)(工具 => 包管理器 => 包管理器控制臺(tái))并運(yùn)行以下命令:

          腳手架-DbContext“Server=SERVERNAME;Database=ProductDB;Integrated Security=True”Microsoft.EntityFrameworkCore.SqlServer -OutputDir 模型

          代替服務(wù)器名稱(chēng)使用您的數(shù)據(jù)庫(kù)服務(wù)器名稱(chēng)。執(zhí)行此命令后,將在項(xiàng)目解決方案中創(chuàng)建模型文件夾。模型文件夾包含兩個(gè)文件,ProductDBContext.csProduct.cs。ProductDBContext.cs負(fù)責(zé)數(shù)據(jù)庫(kù)交互,Product.cs是Products表的模型。

          從 ProductDBContext.cs 中刪除OnConfiguring()方法;它包含一個(gè)數(shù)據(jù)庫(kù)連接字符串,這不是一個(gè)好習(xí)慣。我們將在 appsettings.json 文件中添加連接字符串。

          同時(shí)從此文件中刪除ProductDBContext()構(gòu)造函數(shù)。

          使用 Bacancy,構(gòu)建 .NET 應(yīng)用程序更輕松、更輕松!
          聘請(qǐng)NET 開(kāi)發(fā)人員,他們將幫助您有效地滿(mǎn)足您的項(xiàng)目要求,并具有值得稱(chēng)道的問(wèn)題解決能力。

          配置數(shù)據(jù)庫(kù)連接

          在appsettings.json文件中添加數(shù)據(jù)庫(kù)連接字符串。

          {
           “記錄”:{
             “日志級(jí)別”:{
               “默認(rèn)”:“信息”,
               “Microsoft.AspNetCore”:“警告”
             }
           },
           "允許的主機(jī)": "*",
           “連接字符串”:{
             “ProductDB”:“服務(wù)器=SERVERNAME;數(shù)據(jù)庫(kù)=ProductDB;集成安全性=True;”
           }}

          將SERVERNAME替換為您的數(shù)據(jù)庫(kù)服務(wù)器名稱(chēng)。

          由于我們使用的是 .Net 6 版本,因此我們需要在Program.cs文件中進(jìn)行所需的配置更改。微軟在.Net 6中淘汰了Startup.cs。在之前的.Net版本中,Startup.cs用于配置。

          在 Program.cs 中添加以下行。請(qǐng)參考下圖。

          var connectionString = builder.Configuration.GetConnectionString("ProductDB");builder.Services.AddDbContextPool(選項(xiàng)=>選項(xiàng).UseSqlServer(connectionString));

          此外,在 Program.cs 的頂部添加以下行。

          使用 Microsoft.EntityFrameworkCore;使用 ProductAPI.Models;

          添加產(chǎn)品控制器

          在控制器文件夾下添加一個(gè)新的空 API 控制器ProductsController.cs 。

        •  空置不是一種選擇。Bacancy是一個(gè)可靠的選擇!

        • 您是否正在尋找一家領(lǐng)先的NET 開(kāi)發(fā)公司來(lái)開(kāi)發(fā)您夢(mèng)寐以求的產(chǎn)品?我們?cè)谶@里為您服務(wù)!相信你的選擇。立即連接!

          在 ProductsController 中添加方法

          ProductsController.cs 中,我們將添加 GET、POST、PUT 和 DELETE 端點(diǎn)以實(shí)現(xiàn) CRUD 操作。

          請(qǐng)?jiān)谀?ProductsController.cs 中使用以下代碼。

          使用 Microsoft.AspNetCore.Mvc;使用 Microsoft.EntityFrameworkCore;使用 ProductCRUDAPI.Models;命名空間 ProductCRUDAPI.Controllers{
             [路線(xiàn)(“API/[控制器]”)]
             [API控制器]
             公共類(lèi) ProductsController : ControllerBase
             {
                 私有只讀 ProductDBContext _context;
                 公共 ProductsController(ProductDBContext 上下文)
                 {
                     _context = 上下文;
                 }
                 [HTTPGet]
                 公共異步任務(wù)<IEnumerable<Product>> Get()
                 {
                     返回 await _context.Products.ToListAsync();
                 }
                 [HttpGet("{id}")]
                 公共異步任務(wù)<IActionResult> Get(int id)
                 {
                     如果 (id < 1)
                         返回 BadRequest();
                     var product = await _context.Products.FirstOrDefaultAsync(m => m.Id == id);
                     如果(產(chǎn)品==空)
                         返回未找到();
                     返回確定(產(chǎn)品);
                 }
                 [HttpPost]
                 公共異步任務(wù)<IActionResult> 發(fā)布(產(chǎn)品產(chǎn)品)
                 {
                     _context.Add(產(chǎn)品);
                     等待 _context.SaveChangesAsync();
                     返回確定();
                 }
                 [HTTPPut]
                 公共異步任務(wù)<IActionResult> Put(Product productData)
                 {
                     如果(productData == null || productData.Id == 0)
                         返回 BadRequest();
                     var product = await _context.Products.FindAsync(productData.Id);
                     如果(產(chǎn)品==空)
                         返回未找到();
                     product.Name = productData.Name;
                     product.Description = productData.Description;
                     product.Price = productData.Price;
                     等待 _context.SaveChangesAsync();
                     返回確定();
                 }
                 [HttpDelete("{id}")]
                 公共異步任務(wù)<IActionResult>刪除(int id)
                 {
                     如果 (id < 1)
                         返回 BadRequest();
                     var product = await _context.Products.FindAsync(id);
                     如果(產(chǎn)品==空)
                         返回未找到();
                     _context.Products.Remove(產(chǎn)品);
                     等待 _context.SaveChangesAsync();
                     返回確定();
                 }
             }}

          啟動(dòng)API

          最后,我們完成了 .NET 6.0 中的 Web API 教程。現(xiàn)在,是啟動(dòng)此 API 的時(shí)候了,請(qǐng)按 F5。由于我們使用的是 Swagger UI,我們可以直接執(zhí)行 API。

          我們可以在 Products 下看到 GET、POST、PUT 和 DELETE。我們可以從此頁(yè)面本身執(zhí)行不同的 API 方法。

          Github 存儲(chǔ)庫(kù):.NET 6.0 示例中的 Web API

          下面是.NET 6.0 示例中 Web API 的源代碼。隨意克隆存儲(chǔ)庫(kù)并使用代碼。開(kāi)始開(kāi)發(fā)您的演示應(yīng)用程序并了解如何構(gòu)建 CRUD 操作。

          結(jié)論

          所以,這就是關(guān)于如何在 .NET 6.0 中開(kāi)發(fā) Web API 的全部?jī)?nèi)容。我希望本教程能幫助您開(kāi)始使用 .NET 構(gòu)建基本的 CRUD 操作應(yīng)用程序。如果您有任何問(wèn)題或反饋,請(qǐng)隨時(shí)與我們聯(lián)系。

                            言鼎科技

The End