一、概述
書接上回,上節(jié)我們留了幾個問題,即:
1、接口Hello的名字究竟怎么來的?
2、我們?nèi)绻氚呀涌诟某善渌拿Q,應(yīng)該怎么做?
3、我們繼承ControllerBase,以及[Route(“[controller]”)]屬性,又是分別起到什么作用?
需要解決以上幾個問題,我們就要繼續(xù)深入研究Controller相關(guān)的一些東西,主要包括ControllerBase基類、ApiController 屬性,我們想要精通某個技術(shù),必須要了解器原理,才能做到觸類旁通、靈活運(yùn)用。
ControllerBase 是Web API 控制器的基類,換句話說,Web API 控制器通常都應(yīng)繼承 ControllerBase。做過MVC項(xiàng)目的朋友可能都知道,在MVC里面控制器一般繼承Controller。兩者有什么關(guān)系和區(qū)別嗎?
二、ControllerBase
1、ControllerBase基類和Controller基類的關(guān)系
查看ControllerBase 的定義,這是一個抽象類;
再看Controller的定義,其繼承了ControllerBase
兩者的關(guān)系是:Controller基類派生自ControllerBase
2、ControllerBase基類和Controller基類的區(qū)別
Controller 派生自 ControllerBase,主要區(qū)別是Controller 功能更強(qiáng)大,主要添加對視圖的支持,因此它用于處理 Web 頁面,而不是 Web API 請求。 如果同一控制器需要同時支持視圖和 Web API,那應(yīng)該派生自 Controller。如果僅僅需要支持 Web API,那就派生自 ControllerBase即可,這樣更加輕量級。
3、ControllerBase作用
ControllerBase 類主要作用是提供了很多用于處理 HTTP 請求的屬性和方法。比如我們可以通過這個基類提供的Request屬性獲取請求頭信息:
// 獲取請求頭
var headers = this.Request.Headers;
foreach (var kvp in headers)
{
Console.WriteLine($"{kvp.Key} : {kvp.Value}");
}
運(yùn)行結(jié)果可以看到我們把請求頭的全部信息都獲取到了
有關(guān)ControllerBase 可用方法和屬性的列表,具體不展開,可參考官方文檔。
三、[ApiController]屬性
作用:[ApiController] 屬性應(yīng)用于控制器類,讓控制器上或該控制器下的的API具有以下幾個固定的功能
(1)、屬性路由要求
(2)、自動 HTTP 400 響應(yīng)
(3)、綁定源參數(shù)推理
(4)、Multipart/form-data 請求推理
(5)、錯誤狀態(tài)代碼的問題詳細(xì)信息
下面分別闡述
1、屬性路由要求
先介紹 ASP.NET Core 中的路由的兩種方式 傳統(tǒng)路由 和 屬性路由
傳統(tǒng)路由實(shí)現(xiàn)方式:
// 在Program.cs中或Startup.cs中使用
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
或者
// 在Program.cs中或Startup.cs中使用
app.MapDefaultControllerRoute();
屬性路由的實(shí)現(xiàn)方式:
// 在Program.cs中或Startup.cs中使用
app.MapControllers();
然后在Controller中使用[Route(“”)]屬性指定路由名稱,如示例代碼:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
介紹完了兩種路由,再來看什是屬性路由要求?
所謂屬性路由要求,意思就是如果Controller加了[ApiController]屬性,就必須走屬性路由的方式。這也就能解釋示例代碼Controller上存在[ApiController][Route(“[controller]”)]這兩個屬性。
2、自動 HTTP 400 響應(yīng)
什么是http 400?比如我們對用戶注冊的手機(jī)號碼格式有校驗(yàn)要求,手機(jī)號碼格式不正確時候,這個時候參數(shù)校驗(yàn)就會不通過,需要寫如下代碼。
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
[ApiController] 屬性使模型驗(yàn)證錯誤自動觸發(fā) HTTP 400 響應(yīng)。 因此,操作方法中不需要上述代碼。
3、綁定源參數(shù)推理
我們獲取參數(shù)的時候,有以下一些綁定源:
[FromBody] 請求正文
[FromForm] 請求正文中的表單數(shù)據(jù)
[FromHeader] 請求標(biāo)頭
[FromQuery] 請求查詢字符串參數(shù)
[FromRoute] 當(dāng)前請求中的路由數(shù)據(jù)
[FromServices] 作為操作參數(shù)插入的請求服務(wù)
[AsParameters] 方法參數(shù)
[ApiController] 屬性借助推理規(guī)則,無需手動識別綁定源。先大概描述下,后續(xù)在參數(shù)傳遞和綁定章節(jié)再詳細(xì)展開這些規(guī)則。
4、Multipart/form-data 請求推理
[ApiController] 屬性針對 IFormFile 和 IFormFileCollection 類型的操作。 為這些類型自動推斷內(nèi)容類型為: multipart/form-data。不需要人工在請求Header頭上指定類型。
5、錯誤狀態(tài)代碼的問題詳細(xì)信息
錯誤結(jié)果(狀態(tài)代碼>= 400)以ProblemDetails展示。
ProblemDetails的定義如下:
看怎么使用:
比如有如下的代碼,拋出一個404 NotFound的異常
if (pagePath == null)
{
return NotFound();
}
NotFound 方法會生成帶 ProblemDetails 正文的 HTTP 404 狀態(tài)代碼。 例如:
{
type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
title: "Not Found",
status: 404,
traceId: "0HLHLH32KRN20:00000001"
}
小結(jié)
以上5點(diǎn)就是[ApiController]屬性起到的作用,接下來我們來介紹[RouteAttribute]屬性的作用。
四、[RouteAttribute]屬性
其實(shí)上面屬性路由環(huán)節(jié)基本已經(jīng)介紹了這個屬性,這個屬性的作用就是:指定控制器上的屬性路由
包含三個屬性:
Name :路由名稱。
Order :路由執(zhí)行的順序。
Template :路由模板。 可為 null。
其中,最關(guān)鍵的Template ,一般通過Template指定接口的訪問路徑,比如:
[Route(“/route/norest/{name?}/”)]
五、解決上節(jié)遺留問題
有了這些基礎(chǔ)知識,我們來解決上節(jié)遺留的問題:
1、接口Hello的名字究竟怎么來的?
答:接口Hello的名字是根據(jù)下面代碼有關(guān)
[Route("[controller]")]
public class HelloController : ControllerBase
因?yàn)镃ontroller的名稱為Hello,根據(jù)restful API規(guī)范,Controller里面又只有一個Get請求的接口,故Action的定義沒有影響到接口的最終名稱。
2、我們?nèi)绻氚呀涌诟某善渌拿Q,應(yīng)該怎么做?
答:修改成如下代碼即可,比如改成Greeting
[ApiController]
[Route("")]
public class HelloController : ControllerBase
{
[HttpGet("Greeting",Name = "GetHello")]
public string Hello()
{
return "Hello,World!";
}
}
有兩處改動,去除Controller的Route名稱,改為空字符串,然后給Hello方法指定Template(注:HttpGet可以直接指定Template )。
運(yùn)行結(jié)果如下:
可以看到,名稱已經(jīng)修改成功。
3、我們繼承ControllerBase,以及[Route(“[controller]”)]屬性,又是分別起到什么作用?
答:這個上面都有詳細(xì)描述了
六 、總結(jié)
本節(jié)的目標(biāo)主要講述controller相關(guān)的一些知識,再解決第1個問題的過程中,出現(xiàn)了一個restful API規(guī)范的概念,以及在路由環(huán)節(jié)的介紹基本也是帶過,下節(jié)我們將深入路由環(huán)節(jié),揭開它的神秘面紗。文章來源:http://www.zghlxwxcb.cn/news/detail-828395.html
敬請期待…文章來源地址http://www.zghlxwxcb.cn/news/detail-828395.html
到了這里,關(guān)于2.1 .net 8 ASP.NET Core Web API - Controller詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!