使用ASP.NET Core 3.x 構建 RESTful API - 1.準備工作

来源:https://www.cnblogs.com/cgzl/archive/2019/11/07/11814971.html
-Advertisement-
Play Games

以前寫過ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本。 先決條件 我在B站有一個非常入門的ASP.NET Core 3.0的視頻教程,如果您對ASP.NET Core不瞭解,就可以先看一下裡面的基礎知識和API相關的內容,地址是:https://www.bili ...


以前寫過ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本。

 

先決條件

我在B站有一個非常入門的ASP.NET Core 3.0的視頻教程,如果您對ASP.NET Core不瞭解,就可以先看一下裡面的基礎知識和API相關的內容,地址是:https://www.bilibili.com/video/av65313713/

預備知識:ASP.NET Core 和 C# 

工具:Visual Studio 2019最新版(VSCodeVS for Mac,Rider等也湊合),POSTMAN 

 

Web API 

Web API通常是指“使用HTTP協議並通過網路調用的API”,由於它使用了HTTP協議,所以需要通過URI信息來指定端點。 

 

API是Application Programming Interface的縮寫,是軟體的外部介面。也就是說,針對某個軟體,人們可以知道它的外部功能,但並不知道(也不需要知道)它的內部運作細節,為了從外部調用某些功能,需要指定軟體的調用規範等信息,這樣的規範就是API。 

所以Web API就是一個Web系統,通過訪問URI可以與其進行信息交互。 

 

大多數的 Web API 並不是 RESTful API 

REST一詞是在2000年首次出現的,它是由Roy Fielding博士在《架構風格以及基於網路的軟體架構設計》這篇論文中提到的。他為REST風格的API制定了一套約束規範或者叫架構風格 

所以準確的說,只有符合了Roy Fielding架構風格的Web API才能稱作是RESTful API。但是在實際開發中,有時候也有不完全符合Roy Fielding架構風格的情形出現,針對這點我將會在稍後的文章中介紹。 

 

MVC模式與RESTful API 

本系列文章中我將使用ASP.NET Core 3.0 MVC 來構建 RESTful API。 

 

MVC(Model-View-Controller)我認為是一種主要用來構建UI的架構模式。對於MVC模式其實有很多種解釋存在,但是無論那種解釋,它們都會強調松耦合和關註點分離(separation of concerns)。 

也是由於這兩點的存在,程式的可測試性會大大提高,程式各部分的可復用性也很高。 

更多關於MVC的介紹,可以看一下微軟的官方文檔:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-3.0 

 

註意:MVC不是一個完整的應用程式架構,我認為它主要是用在展示層。所以實現UI就是MVC的一部分工作。 

 

如何把MVC映射到API

我認為API同樣可以看作是UI,它就是為API消費者所提供的UI。 

讓我們把MVC的三部分分別對應到API: 

  • Model,它負責處理程式數據的邏輯。這裡的Model可以包含在當前級別獲取從存儲獲取數據的邏輯。但是有一些Model不包含任何邏輯,例如API所使用的DTOData transfer objects),這類的Model會被串列化到響應的body裡面。 

  • View,它是程式里負責展示數據的那部分。在構建API的時候,View就是數據或資源的展示。現在通常使用JSON格式。 

  • Controller,它負責ViewModel之間的交互。包括處理用戶輸入,用API的術語來講,和API交互的“用戶”就是指API的消費者,這類用戶通常是另一個程式,例如Angular的SPA程式。 

 

下麵看看MVC這三部分的依賴關係: 

Model 
View 
Controller

Controller和View依賴於ModelController依賴於View,這也是分離的一個好處。 

換句話說,Controller會選取適當的View來展現給用戶,並一同把用戶請求的Model數據帶回去。 

 

當API消費者發出請求的時候,在Controller上面的Action將會被觸發,Controller會把接收到的輸入數據發送給負責業務處理邏輯或數據訪問邏輯的那部分程式。然後Controller會把Model返回給View,這裡的View就是資源的展示(通常是JSON格式)。 

 

接下來我們就是用這套概念和ASP.NET Core 3.0 來創建RESTful API 

但是請註意,通過ASP.NET Core MVC或API模板建立出來的新項目,我們並不會直接得到RESTful(REST架構風格)的API。我們必須在這個基礎上,自己構建RESTful的API,因為之前已經提到了,標準的RESTful API有很多約束和規範。 

 

創建ASP.NET Core 3.0 Web API項目 

打開VS2019,選擇項目模板ASP.NET Core Web Application 

Create a new project 
Recent project templates 
gRPC Service 
•3 ASP.NET Core Web Application 
Console App (.NET Framework) 
Windows Forms App (.NET Framework) 
Search for templates (Alt+S) 
All Platforms 
Console App (.NET Core) 
Clear 
All Project Types 
A project for creating a comman ne application that can n_ln on .NET Core on Windows, Linux and MacOS. 
Linux macOS 
dows Console 
ASP.NET Core Web Application 
ject templates for creating ASP.NET Core web apps and web APIs for Windows, Linux and macOS using .NET Core 
or .NET Framework. Create web apps with Razor Pages, MVC, or Single Page Apps (SPA) using Angular, React, or React * 
Redux. 
ma cas 
81azor App 
Windows 
Coud 
Semi ce 
Web 
n 
Project templates for creating Blazor apps that that run on the server in an ASP.NET Core app or in the browser on 
WebAssembIy. These templates can be used to build web apps with rich dynamic user interfaces (UIs). 
Linux macOS Windcms Coud Web 
Class Library (.NET Standard) 
A project for creating a class library that targets .NET Standard. 
C# Android iOS 
Azure Functions 
Linux macOS Windcms 
ibrary 
A template to create an Azure Function project. 
Azure Coud

 

然後為項目和解決方案起名字,並選擇所在目錄: 

Configure your new project 
ASP.NET Core Web Application L 
Inux 
Project name 
Routine.Api 
Location 
o 
Solution name 
Routine 
Place solution and project in the same directory 
macOS 
Windcwvs 
Coud 
Service 
Web

 

然後選擇ASP.NET Core的項目模板: 

Create a 
.NET Core 
Empty 
An empty 
new ASP.NET Core web application 
ASP .NET 3.0 
ect template for creating an ASP .NET Core application. This template does not have any content in it. 
A project template for creating an ASP .NET Core application with an example Controller for a RESIfuI HITP service. 
This template can also be used for ASP .NET Core MVC Views and Controllers. 
Web Application 
A project template for creating an ASP NET Core application with example ASP NET Razor Pages content. 
Web Application (Model-View-Controller) 
A project template for creating an ASP .NET Core application with example ASP .NET Core MVC Views and 
Controllers. This template can also be used for RESIfuI HITP services. 
o 
Angular 
A project template for creating an ASP .NET Core application with Angular 
React.js 
A project template for creating an ASP NET Core application with React.js 
Get additional project templates 
Authentication 
No Authentication 
Change 
Adv ced 
Configure for HITPS 
Enable Docker Support 
(Requires Docker Desktop) 
Linux 
Author: Microsoft 
Source: .NET Core 3.010 
Create

首先要選擇ASP.NET Core 3.0 

這裡我選擇了API這個模板。在以前,我通常會選擇Empty模板,因為其它模板通常包含很多我不需要的東西,但是ASP.NET Core 3.0的API模板還是比較乾凈的,可以接受。 

最後,由於本課程中不需要使用HTTPSDocker,所以把這兩個東西都勾掉。 

 

解剖 ASP.NET Core 3.0 API 模板項目 

點擊Create,項目就建立好了: 

Solution 'Routine' (I of I project) 
Routine-Api 
Connected Services 
Dependencies 
Analyzers 
•@ Frameworks 
properties 
launchSettingsjson 
Controllers 
c* WeatherForecastControIIer.cs 
appsettingsjson 
C" 
C" 
C" 
appsettings.DeveIopmentjson 
Program.cs 
Startup.cs 
WeatherForecast.cs

 

先看看 appsettings.json 

Routine.Api 
appsettings.json -E X 
Schema: http://json.schemastore.org/appsettings 
2 8' "Logging" • 
"LogLevel": 
"Default": "Information" , 
4 
"Microsoft": "Warning", 
5 
"Microsoft. Hosting. Lifetime": "Information" 
6 
7 
8 
"AllowedHosts": 
9 
10 
11

裡面只有預設的Log配置以及允許的Hosts 

 

appsettings.Development.json裡面: 

appsettings.json 
appsettings.DeveIopment.json -E X 
Schema: http://json.schemastore.org/appsettings 
2 8' "Logging" • 
"LogLevel": 
"Default": 
Routine.Api 
4 
5 
6 
7 
8 
9 
10 
"Debug" , 
"System": "Information" , 
"Microsoft": "Information"

也只有關於Log的預設配置。 

 

註意:您需要知道appsettings.json  appsettings.Development.json之間的關係,關於這點可以看我ASP.NET Core 3.0的入門視頻教程,但是更簡單的辦法是看一下官方文檔:在ASP.NET Core中使用多個環境 

 

項目模板里還有兩個類我們不需要,所以把它刪掉,分別是WeatherForecastControllerWeatherForecast 

Routine.Api 
C" 
C" 
C" 
Connected Services 
Dependencies 
Analyzers 
•@ Frameworks 
Properties 
launchSettingsjson 
Controllers 
C* WeatherForecastControIIer.cs 
appsettings.json 
appsettings.DeveIopmentjson 
Program.cs 
Startup.cs 
Weather Forecast.cs

 

Program.cs 

public class Program 
public static void Main(stringC] args) 
CreateHostBuilder(args) . Build( ) . Run( ) ; 
public static IHostBuilder CreateHostBuilder(string[] args) 
Host. CreateDefaultBuilder(args) 
. ConfigureWebHostDefaults(webBuilder 
webBuilder . ) ; 
D;

這裡其實就是整個程式的入口,Main方法負責配置和運行整個Web程式。 

由於這是一個Web項目,所以我們還需要一個宿主(Host),這個宿主就是由下麵的CreateHostBuilder方法來負責創建的。該方法首先會創建出一個實現了IHostBuilder介面的類(HostBuilder)的實例,然後調用它的Build方法來創建宿主(類型為Host,實現了IHost介面),最後調用宿主上面的Run方法來運行程式。 

 

我們暫時不修改這裡面的代碼,所以一切都會按照項目模板預設的配置進行,註意到下麵的方法里我們使用到了Startup這個類: 

public static IHostBuilder CreateHostBuilder(string[] args) 
Host . CreateDefaul tBuilder( args) 
. ConfigureWebHostDefaults(webBuilder 
webBuilder . ) ;

所以我們來看看Startup類。 

 

Startup.cs 

在這個類的構造函數里: 

public class Startup 
O references 
public Startup(IConfiguration configuration) 
Configuration = 
configuration; 
I reference 
Configuration { get; 
public IConfiguration

我們看到IConfiguration被註入了,這樣就允許我們使用配置信息了,例如appsettings.json裡面的配置信息。 

 

下麵有一個ConfigureServices方法: 

O references 
public void ConfigureServices(IServiceCollection services) 
services .AddControIIers( ) ;

這個方法負責向服務容器裡面註冊服務,已註冊的服務可以通過依賴註入的方式在整個應用程式的其它地方進行使用。這裡的服務是一個比較廣義的概念,它就是一個在整個程式中做一些通用性操作的組件。 

 

這裡面只有一句話: 

3.0之前的版本里,這裡面應該寫的是services.AddMvc();,實際上在ASP.NET Core 3.0裡面這樣寫也是可以的。但是AddMvc()裡面不僅僅包含用於構建API的服務,還包含很多其它服務,例如構建View視圖和TagHelper相關的服務等。而AddControllers()方法只包含用於構建API的那些服務,例如Controller的支持、Model綁定、Data Annotation和格式化器等等。 

 

最下麵還有一個Configure方法: 

O references 
public 
if 
Configure(IApplicationBuilder app, 
void 
(env . IsDevelopment( ) ) 
app . UseDeveloperExceptionPage( ) ; 
IWebHostEnvironment env) 
app . UseRouting( ) ; 
app . UseAuthorization( ) ; 
app.UseEndpoints(endpoints 
endpoints .MapControllers( ) ;

這個方法使用到了在ConfigureServices方法裡面註冊和配置的服務,所以這個方法是在ConfigureServices方法之後被調用的。 

Configure方法是用來指定ASP.NET Core Web程式是如何響應每一個HTTP請求的。換句話說,也就是我們在這裡配置請求的管道,配置的方法就是在這裡添加很多中間件(Configure方法裡面每一個app.UseXxx就是添加一個中間件,可以查看中間件的官方文檔來瞭解更多)。 

 

在開發環境的時候,如果有異常發生,那麼會展示出一個異常頁面: 

if (env.IsDevelopment()) 
app . UseDeveloperExceptionPage( ) ;

 

app.UseAuthorization(),它會為整個Web程式添加授權的能力。當你需要考慮API安全性的時候,這點就很重要了。通常授權配置是在ConfigureServices方法里完成的,而我現在沒有對授權進行配置,但是app.UseAuthorization()仍然會允許API可以被匿名的訪問。 

 

其它這幾句話: 

這幾句話都是用來指定如何把HTTP請求分配到特定的Controller Action上面的。也就是說這是關於路由的。 

 

很重要的一點就是:每一個請求會按照代碼的順序穿越所有在這裡添加的中間件。但是每一個中間件都有可能將請求短路,這樣的話請求就不會進入下一個中間件了,而會按照原路返回。 

請求處理模式顯示請求到達、通過三個中間件進行處理以及響應離開應用。

所以,添加中間件的順序非常重要。如果你把授權中間件放在了Controller的後邊,那麼即使需要授權,那麼請求也會先到達Controller並執行裡面的代碼,這樣的話授權就沒有意義了。 

 

修改項目啟動配置 

我喜歡使用控制台啟動Web程式,這樣可以很直觀的看到Log信息。為達到這個目的,可以修改launchSettings.json文件: 

 

修改後,在項目的Debug屬性里也有體現: 

由於我主要是使用POSTMAN來調用API,所以我不需要Launch Browser(啟動瀏覽器)。 

 

運行程式 

可以看到程式可以正常運行,並且在控制臺上有日誌的輸出。 

 

添加數據存儲功能

想要做RESTful API的話,我們還需要數據,這裡我準備採用SQLite來作為數據存儲,使用Entity Framework Core 作為 ORM來與資料庫進行交互。針對Entity Framework Core 3.0 如何在ASP.NET Core 裡面使用,官方有個很不錯的教程 

 

下麵開始在項目里添加SQLiteEFCore 3.0(這部分官方文檔可以點擊這裡)的支持: 

  • 首先,需要在我們的項目里通過Nuget添加 Microsoft.EntityFrameworkCore.Sqlite 這個包。 

  • 然後,還需要安裝 Microsoft.EntityFrameworkCore.Tools 這個包,它是用來做遷移的,關於這個包的更多功能解釋,可以查看官方文檔 

 

建立Entities 

我們先把項目的需求想的簡單一點,暫時我們就做一個公司和公司員工的維護,兩個Entity,兩個表。 

 

公司(Company)的Entity: 

—namespace Routine.Api. Entities 
I reference 
public class Company 
O references 
public 
O references 
public 
O references 
public 
O references 
public 
{ get; set; } 
Guid Id 
{ get; set; } 
string 
Name 
{ get; set; } 
string 
Introduction 
ICollection<Employee> Employee$ 
{ get; 
set;

為什麼使用Guid作為主鍵的類型? 

 

員工(Employee)的Entity

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 調優基本概念 在調整JVM性能時,通常有三個組件需要考慮: 堆大小調整 垃圾收集器調整 JIT編譯器 大多數調優選項都與調整堆大小和選擇合適的垃圾收集器有關,JIT編譯器對性能也有很大影響,但很少需要對其進行調優,尤其是針對較新版本的JVM。 通常,在進行Java程式調優的時候,會重點關註兩個主要指 ...
  • 這篇文章主要分享 Timer 毫秒精度的定時器。本地版本:PHP 7.2.6、Swoole 4.3.1。Timer主要有三個方法:swoole_timer_tick 間隔的時鐘控制器swoole_timer_after 指定的時間後執行swoole_timer_clear 刪除定時器示例代碼:運行結 ...
  • 包裝 1.二次加工標準類型(包裝) class List(list): def append(self, a_objcet): if type(a_objcet) is str: super().append(a_objcet) else: print('請傳入字元轉類型') l1 = List(' ...
  • 我們都知道 HTTP 是一種協議,允許 WEB 伺服器和瀏覽器通過互聯網進行發送和接受數據。想對 HTTP 進行詳細的瞭解,可以找下其他文章,這篇文章不多做介紹。我們在網上能看到的界面,圖片,動畫,音頻,視頻 等,都有依賴這個協議的。在做 WEB 系統的時候,都使用過 IIS、Apache、Ngin ...
  • 1. 內置函數 什麼是內置函數? 就是python給你提供的,拿來直接⽤的函數,比如print,input等等,截⽌到python版本3.6.2 python⼀共提供了68個內置函數。他們就是python直接提供給我們的,有 ⼀些我們已經⽤過了,有⼀些還沒有⽤過,還有⼀些需要學完了⾯向對象才能繼續學 ...
  • 面向對象語言中,介面用於定義對象的行為。介面只指定對象應該做什麼,實現這種行為的方法(實現細節)是由對象來決定。 ...
  • 今天,我的任務是,在 Laravel 應用程式用戶個人資料頁面上,用戶名旁邊添加一個綠點,表示他們是否線上。我首先想到的是,我們將需要啟動一個 node.js 伺服器並跟蹤每個用戶的活動套接字連接。然後用當前登錄的用戶套接字,我們可以實時更新線上狀態!唯一的問題是,這是我們目前的要求,有點超過頂部, ...
  • 參考以下博文,我這裡只是筆記一下,原文會更加詳細 c#基礎系列1 深入理解值類型和引用類型 堆棧和托管堆c# 值類型和引用類型 紅色表示——“這啥?”(真實1個問題引出3個問題) CLR支持的兩種類型 引用類型: 引用類型從托管堆上分配,new操作符會返回對象的指針——指向對象數據的記憶體位置的一個引 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...