目錄
一、Web API項(xiàng)目創(chuàng)建入門?
?1.1 Web API 項(xiàng)目的創(chuàng)建
?編輯
1.2 Post、Put等操作方法
二、Restful
?2.1 什么是REST?
2.2? Restful 的優(yōu)缺點(diǎn)
三、Web API簡單實(shí)例
3.1 開發(fā)Web API
?? ? ??
一、Web API項(xiàng)目創(chuàng)建入門?
????????瀏覽器和服務(wù)器之間傳遞的主要是HTML,而手機(jī)App等客戶端和服務(wù)端之間傳遞的是JSON等結(jié)構(gòu)化的數(shù)據(jù)。我們把提供結(jié)構(gòu)化數(shù)據(jù)服務(wù)的接口叫做Web API。
?1.1 Web API 項(xiàng)目的創(chuàng)建
?創(chuàng)建成功后:
項(xiàng)目中生成的樣本代碼 WeatherForecastController.cs是一個控制類,基本結(jié)構(gòu)如下:
//這個路由控制規(guī)則設(shè)置對 /WeatherForecast路徑請求由WeatherForecastController來處理。
[ApiController] //Web API控制類添加的Attribute
//設(shè)置路由規(guī)則
[Route("[controller]")] // [controller]代表控制器名字,也就是WeatherForecast
public class WeatherForecastController : ControllerBase
{
[HttpGet] //作為操作方法的入口,因此下面方法名是什么都不影響程序
public IEnumerable<WeatherForecast> Get() //處理 /WeatherForecast的請求
{
//代碼塊
}
}
?????????總結(jié):控制器類上添加的[Route("[controller]")]以及Get方法上添加的[HttpGet]決定了當(dāng)客戶端向? ?/WeatherForecast這個路徑發(fā)送GET請求的時(shí)候,又Get方法進(jìn)行處理。Get方法返回的對象會被自動進(jìn)行的JSON序列返回給客戶端。
項(xiàng)目啟動后顯示界面:
? ? ? ? ?這個界面是我們創(chuàng)建項(xiàng)目的時(shí)候勾選的【啟用OpenAPI支持】所啟用的Swagger頁面,這個界面會根據(jù)項(xiàng)目中的接口定義生成一個接口定義瀏覽的界面。
1.2 Post、Put等操作方法
? ? ? ? Web API會根據(jù)HTTP請求的謂詞來匹配操作方法,因此我們可以為控制器類增加一個[httpPost]和[HttpPut]等處理POST和PUT請求。
例 在WeatherForecastController中增加一個SaveNote方法:
? ? ? ? 運(yùn)行后發(fā)現(xiàn)在Swagger頁面中多出了一個Post請求選項(xiàng)。點(diǎn)擊【POST】,再點(diǎn)擊右上角的【Try it out】按鈕,出現(xiàn)了默認(rèn)JSON格式的請求報(bào)文模板:
二、Restful
?2.1 什么是REST?
Web API開發(fā)有兩種風(fēng)格:
? ? ? ? 1.面向過程的 (簡稱RPC)
? ? ? ? 2.面向REST的(簡稱REST)
? ? ? ? 在RPC風(fēng)格的Web API中,通過“控制器/操作方法”的形式把服務(wù)器端的代碼當(dāng)做方法去調(diào)用。把HTTP當(dāng)成傳輸數(shù)據(jù)的通道,不關(guān)心HTTP謂詞。通過QueryString(查詢字符串)、請求報(bào)文體給服務(wù)器傳遞數(shù)據(jù)或者狀態(tài)碼::
- ?當(dāng)需要加載所有用戶的時(shí)候,我們就向/Persons/GetAll這個路徑發(fā)送GET請求.
- ?當(dāng)需要加載id=8的用戶的時(shí)候就向/Persons/GetById?id=8這個路徑發(fā)送GET請求.
- ?當(dāng)需要更新id=8的用戶的時(shí)候就向/Persons/Update這個路徑發(fā)送POST請求
那什么是REST:按照HTTP的語義來使用HTTP協(xié)議:
- 使用URL進(jìn)行資源定位。獲取id=8:/user/8;獲取id=8的用戶的訂單列表:/user/8/orders.
- HTTP謂詞:GET(獲取資源)、POST(新增資源)、PUT(整體更新,不存在則創(chuàng)建),DELETE(刪除資源).
- DELETE、PUT、GET是冪等的,POST是不冪等的;
?何為冪等?
????????冪等就是對于一個接口采用同樣的參數(shù)請求一次和請求多次的結(jié)果是一致的,不會因?yàn)槎啻握埱蠖a(chǎn)生副作用。(比如一個人發(fā)表評論的時(shí)候由于網(wǎng)卡又點(diǎn)擊了一次發(fā)布,最終數(shù)據(jù)庫只保存了一次的發(fā)布內(nèi)容就是冪等)
- ?GET的響應(yīng)可以被緩存;
- ?服務(wù)端通過狀態(tài)碼反映資源獲取的結(jié)果:404(訪問用戶不存在),403(沒有權(quán)限),201(新增用戶請求成功);
?那么如何請求Restful風(fēng)格的控制器呢?
/*
1.當(dāng)我們需要加載所有用戶的時(shí)候就向/api/Persons這個路徑發(fā)生GET請求,添加了
[HttpGet]的GetPersons方法就會被調(diào)用
2.當(dāng)我們需要加載id=8的用戶的時(shí)候,向/api/Person/8這個路徑發(fā)送GET請求,添加
了[HttpGet("{id}")]的方法就會被調(diào)用
......................
......................
*/
[Route("api/[controller]")]
public class PersonController : ControllerBase
{
[HttpGet]
public IEnumerable<Person> GetPerson();
[HttpGet("{id}")]
public Person GetPerson(long id);
[HttpPut("{id}")]
public void UpdatePerson(long id,Person person)
[HttpPost("{id}")]
public void SavePerson(Person person);
[HttpDelete("{id}")]
public void DeletePerson(long id);
}
2.2? Restful 的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 通過URL進(jìn)行定位,避免使用QueryString,報(bào)文體定位,語義更清晰
- 通過HTTP謂詞表示不同的操作,接口統(tǒng)一且具有自描述性
- 可以對GET、PUT、DELETE等冪等操作失敗后進(jìn)行重試
- 可以對GET請求進(jìn)行緩存,提升系統(tǒng)的訪問速度,降低服務(wù)器壓力
- 通過HTTP狀態(tài)碼反映服務(wù)端的處理結(jié)果,能夠統(tǒng)一錯誤碼
- 網(wǎng)管系統(tǒng)可以根據(jù)狀態(tài)碼來分析系統(tǒng)的訪問數(shù)據(jù)
缺點(diǎn):?
- 真實(shí)系統(tǒng)中的資源非常復(fù)雜,很難清晰的進(jìn)行資源劃分
- 不是所有的操作都能夠簡單的對應(yīng)到確定的HTTP謂詞中
- 系統(tǒng)進(jìn)化可能改變冪等性
- HTTP狀態(tài)碼個數(shù)有限,無法滿足
- 有些客戶端可能不支持PUT、DELETE請求
三、Web API簡單實(shí)例
3.1 開發(fā)Web API
(1)創(chuàng)建一個控制器類:
[Route("api/[controller]/[action]")]
[ApiController]
public class LoginController : ControllerBase
{
[HttpPost]
public ActionResult<LoginResult> Login(LoginRequest loginReq)
{
if(loginReq.UserName=="admin" && loginReq.Password=="123456")
{
var processes = Process.GetProcesses().Select(p => new ProcessInfo(
p.Id,p.ProcessName,p.WorkingSet)).ToArray();
return new LoginResult(true, processes);
}
else
{
return new LoginResult(false, null);
}
}
}
//請求的參數(shù)信息
public record LoginRequest(string UserName,string Password);
//進(jìn)程信息,分別表示: 進(jìn)程ID 進(jìn)程名 進(jìn)程分配的物理內(nèi)存量
public record ProcessInfo (int Id,string ProcessName, long WorkingSet);
//請求信息是否正確
public record LoginResult(bool IsOK, ProcessInfo[] Processes);
在Swagger頁面測試Login方法:
? ? ? ? 當(dāng)我們通過請求報(bào)文體設(shè)置錯誤的用戶信息時(shí):
? ? ? ? 當(dāng)設(shè)置正確的信息時(shí):文章來源:http://www.zghlxwxcb.cn/news/detail-776724.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-776724.html
?? ? ??
到了這里,關(guān)于【c#】了解開發(fā)Web API的基本方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!