最近對(duì)之前設(shè)備監(jiān)控項(xiàng)目中所用的ASP.NET Web API
技術(shù)做了一個(gè)小小的總結(jié),寫(xiě)了一個(gè)簡(jiǎn)單的demo,以供師弟師妹們參考。這個(gè)系列可以作為ASP.NET Web API的入門(mén)實(shí)戰(zhàn),demo比較簡(jiǎn)單,但是我認(rèn)為對(duì)于構(gòu)建基于ASP.NET Web API的REST
風(fēng)格的服務(wù)提供了一個(gè)整體的思路,對(duì)于入門(mén)會(huì)有一定的幫助吧。
前言
什么是Web API
Web API是一個(gè)比較寬泛的概念,這里我們提到Web API特指ASP.NET Web API。
官方定義如下,強(qiáng)調(diào)兩個(gè)關(guān)鍵點(diǎn),即可以對(duì)接各種客戶端(瀏覽器,移動(dòng)設(shè)備),構(gòu)建http服務(wù)的框架。Web API利用Http協(xié)議的各個(gè)方面來(lái)表達(dá)服務(wù)(例如 URI/request response header/caching/versioning/content format),因此就省掉很多配置。
利用ASP.NET Web API
我們可以很輕松的構(gòu)建REST
風(fēng)格的服務(wù)。
Web API在ASP.NET完整框架中地位如下圖:
Web API功能簡(jiǎn)介
支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作,通過(guò)不同的http動(dòng)作表達(dá)不同的含義,這樣就不需要暴露多個(gè)API來(lái)支持這些基本操作。
請(qǐng)求的回復(fù)通過(guò)Http Status Code表達(dá)不同含義,并且客戶端可以通過(guò)Accept header來(lái)與服務(wù)器協(xié)商格式,例如你希望服務(wù)器返回JSON格式還是XML格式。
請(qǐng)求的回復(fù)格式支持 JSON,XML,并且可以擴(kuò)展添加其他格式。
原生支持OData。
支持Self-host或者IIS host。
支持大多數(shù)MVC功能,例如Routing/Controller/Action Result/Filter/Model Builder/IOC Container/Dependency Injection。
REST風(fēng)格服務(wù)簡(jiǎn)介
REST表示表述性狀態(tài)轉(zhuǎn)移,它代表的是運(yùn)行在HTTP上的一個(gè)簡(jiǎn)單的無(wú)狀態(tài)的架構(gòu),每一個(gè)唯一URL代表一個(gè)資源。在創(chuàng)建RESTful服務(wù)時(shí),應(yīng)遵循四個(gè)基本的設(shè)計(jì)原則:
使用HTTP方法(動(dòng)詞),使用統(tǒng)一的方式來(lái)獲取資源(交互的統(tǒng)一接口),即檢索資源使用GET,創(chuàng)建資源使用POST, 更新資源使用PUT / PATCH,刪除資源使用DELETE。
與資源的交互是無(wú)狀態(tài)的, 因此由客戶端發(fā)起的每個(gè)請(qǐng)求應(yīng)當(dāng)包括HTTP請(qǐng)求的所有參數(shù),上下文信息和所需服務(wù)器返回?cái)?shù)據(jù)數(shù)據(jù)類(lèi)型等。
資源標(biāo)識(shí)應(yīng)通過(guò)URI來(lái)定義,簡(jiǎn)單來(lái)說(shuō)應(yīng)該是只使用URI來(lái)完成服務(wù)器與客戶端和資源之間的交互。這些URI可以看作一個(gè)RESTful服務(wù)提供的接口。
支持JSON或/和XML等多種格式作為數(shù)據(jù)傳輸格式。
開(kāi)發(fā)環(huán)境
筆者所用的開(kāi)發(fā)環(huán)境如下:
- 操作系統(tǒng):Windows 10 ,64位
- IDE:Visual Studio 2013
- 數(shù)據(jù)庫(kù):SqlServer 2012
各位小伙伴可以根據(jù)自己的需求選用不同的IDE和數(shù)據(jù)庫(kù),IDE強(qiáng)烈推薦VS2013以上的版本,以免掉坑。
涉及技術(shù)
在我們的實(shí)例中用到了:
- SQL Server數(shù)據(jù)庫(kù)保存數(shù)據(jù)
- Web API提供REST風(fēng)格的服務(wù)
- ORM映射采用的是Entity Framework的Code First開(kāi)發(fā)方式
- Vue.js解析Wen API返回的數(shù)據(jù),對(duì)數(shù)據(jù)的雙向綁定也會(huì)做一個(gè)簡(jiǎn)單的介紹
創(chuàng)建Web API項(xiàng)目
打開(kāi)VS,新建項(xiàng)目,創(chuàng)建ASP.NET Web 應(yīng)用程序,創(chuàng)建相應(yīng)的解決方案,如下圖:
選擇模板為Web API
,我們可以看到MVC
和Web API
兩項(xiàng)已經(jīng)默認(rèn)打勾,
作為簡(jiǎn)單的 ASP.NET Web API 入門(mén)項(xiàng)目,我們?cè)谶@里先不涉及身份認(rèn)證,因此,點(diǎn)擊右側(cè)的“更改身份認(rèn)證”,我們選擇“無(wú)身份認(rèn)證”,如下圖所示:
就這樣,一個(gè)Web API項(xiàng)目就創(chuàng)建好了,不得不感嘆 VS 是宇宙最強(qiáng)大的 IDE ,微軟出的東西就是簡(jiǎn)單易用。
看一下代碼結(jié)構(gòu),是典型的MVC,我們可以看到在Controller
文件夾中有兩個(gè)自動(dòng)生成的控制器類(lèi),供我們參考:
在ValuesController.cs
中,ValuesController
繼承了ApiController
類(lèi),提供了GET
、POST
、PUT
、DELETE
方法,為了讓示例簡(jiǎn)單化,values值被存儲(chǔ)在控制器類(lèi)中的固定數(shù)組中。當(dāng)然,在實(shí)際應(yīng)用程序中,你可能想要查詢數(shù)據(jù)庫(kù)或使用其他外部數(shù)據(jù)源,我們將會(huì)在下面的部分進(jìn)行介紹。代碼如下:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
控制器定義了兩個(gè)返回value值的方法:
- IEnumerable<string> Get()方法將整個(gè)列表作為IEnumerable類(lèi)型返回。
- Get(int id)方法通過(guò)它的ID來(lái)查找單個(gè)value值。
沒(méi)錯(cuò),你已經(jīng)有一個(gè)可以使用的web API了。控制器上的每個(gè)方法都對(duì)應(yīng)一個(gè)或多個(gè)URI,我們先嘗試調(diào)用一下Web API,點(diǎn)擊啟動(dòng)調(diào)試,可以看到項(xiàng)目的主頁(yè)是基于Boonstrap的。
調(diào)用Web API,控制器方法和對(duì)應(yīng)的URI如下:
Controlle Method為:IEnumerable<string> Get()
URI為: api/values
Controlle Method為:string Get(int id)
URI為: api/values/id
調(diào)用結(jié)果如下圖(所用瀏覽器為Chrome,使用IE核瀏覽器會(huì)提示保存Json文件):
1.調(diào)用api/values
2.調(diào)用api/values/2
上面調(diào)用Web API返回的格式XML
格式的,后邊的部分我會(huì)介紹如何強(qiáng)制返回Json格式。
下面將具體介紹如何創(chuàng)建數(shù)據(jù)實(shí)體并運(yùn)用Entity Framework與數(shù)據(jù)庫(kù)進(jìn)行交流。