前言
回頭想來,沒想到自己卻堅持下來了,EntityFramework系列終於全部完成了,給自己點個贊先。本系列將着手於Web API,關於一些基礎的介紹及定義就不再敘述,請參考園友們文章,非常詳細,我也是在此基礎上步入學習的。
簡短介紹
我們知道Web API是基於ASP.NET平台構建RESTful應用程序的框架(關於RESTful請參考園友Liam Wang關於其詳細介紹),通過訪問在方法標記為HttpPost、HttpGet、HttpPut等得知。
問題探討
我們知道Web API默認輸出的格式為JSON,但是當我們進行測試時大部分瀏覽器輸出的都是XML格式,這種情況真是令人唏噓不已。下面我們就以火狐為例,同時利用它的Fire Bug進行監控。我們利用測試數據,並進行訪問如下:
為何會出現如此情況呢?
我們利用Fire Bug查看其報文頭信息來進行分析,如下:
因為Web API是根據檢測請求頭信息(Accept Header)來查找已經格式化注冊的響應頭信息(Content-Type)來確定它應該返回的輸出類型。正是這種根據請求類型來響應相應類型的互動機制,使得Web API的功能變得強大,也就是說它能根據請求的透明來獲得不同類型的輸出。
大部分瀏覽器發送的都是如下請求頭信息:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Web API檢測上述信息是從左到右並且同時嘗試通過從格式化注冊的列表中去找到一個匹配它的並且支持的介質類型(meta type)。在此種情況下,application/xml與Xml Formatter匹配上了,所以會以XML格式進行輸出並返回。
或許有些瀏覽器的可能請求信息為如下:
Accept: text/html,application/xhtml+xml,*/*;q=0.9
大部分瀏覽器中這樣同樣也是以XML格式打開,但是平時覺得在兼容方面非常惡心的IE 9模式下卻是JSON,當然既然能以JSON打開肯定是沒有包括application/xml了。
或許有些瀏覽器的可能請求信息為如下:
Accept: text/html, application/xhtml+xml, */*
這更加不必多說了,這更加敏感的就暴露出要以XML格式輸出了。
根本上解決方案
上述說了那么多都是以XML格式輸出,如果在項目中需要大量的以JSON格式輸出的數據的話,那么肯定會用到Web API了,我這才入門就是以這種方式回饋我,還能夠好好的玩耍嗎,看到園中大部分都是介紹大部分瀏覽器都是以XML格式輸出的,但是卻沒給出一個解決方案,個人感覺有點欠妥,於是我就了解了下,通過上述我們知道請求過來的請求頭信息是要和我們注冊的格式進行匹配的並響應對應的格式,那么我們完全可以在匹配時做一點手腳將其請求過來的XML格式進行過濾不就ok了嗎,此時就要用到我們Web API的配置文件 WebApiConfig 中的 Register 方法來進行過濾即可。
雖然我們很難改變瀏覽器的請求頭信息,但是我們可以改變服務器的頭信息,如下:
var formatters = config.Formatters.Where(formatter =>
formatter.SupportedMediaTypes.Where(media =>
media.MediaType.ToString() == "application/xml" || media.MediaType.ToString() == "text/html").Count() > 0) //找到請求頭信息中的介質類型
.ToList();
foreach (var match in formatters)
{
config.Formatters.Remove(match); //移除請求頭信息中的XML格式
}
檢驗一下 ,輸出成功:
總結
至此Web API算是入門吧,一步步來,不着急,有問題就解決,多花點時間也是值得的,你說呢!!!