WebAPI返回資料型別解惑 以及怎樣解決Extjs無法解析返回的xml
最近開始使用WebAPI,上手很容易,然後有些疑惑
1.WebAPI預設返回什麼資料型別,json還是xml? 2.怎麼修改WebAPI的返回資料型別,我用IE瀏覽器請 求返回的資料都是JSON格式的,用Firefox和Chrome返回資料格式是XML,然後自己用HttpWebRequest請求返回的是JSON格 式的,我就納悶了,咋同樣的程式、同樣的配置檔案,輸出資料格式為啥還帶不一樣的,就算你預設輸出json或者xml都可以理解,咋還不同瀏覽器,輸出格 式不同,經過一番研總算搞懂了原因
經過測試發現使用IE瀏覽器返回的資料是json,而使用Firefox和Chrome返回的則為xml,經研究發現IE在發生http請求時請求頭accpet節點相比Firefox和Chrome缺少"application/xml" 型別,由於WebAPI返回資料為xml或json格式,IE沒有傳送可接受xml和json型別,所以預設為json格式資料,而Firefox和 chrome則傳送了可接受xml型別,故返回了xml資料,下面是IE、Firefox和Chrome瀏覽器的請求頭
瀏覽器 |
返回資料格式 |
accept請求頭 |
---|---|---|
IE |
json |
text/html, application/xhtml+xml, */* |
Firefox |
xml |
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,*/* |
Chrome |
xml |
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,*/* |
繼續進行如下測試
1.只發送accept:application/json,結果返回了json
2.只發送accept:application/xml,結果返回了xml
3.同時傳送accept:application/xml,application/json,結果返回了json
4.同時傳送accept:application/json,application/xml,結果返回了json
5.修改優先順序同時傳送application/xml;q=1.0,application/json;q=0.9,結果返回了xml
由此可以得出結論:
WebAPI的返回資料型別是有請求頭的accept來決定的,預設返回型別為json 1.application/json和application/xml都沒有時,返回json資料 2.僅有application/json時,返回json資料 3.僅有application/xml時,返回xml資料 4.同時有application/json和application/json時,返回資料型別和兩者的順序無關,若兩者優先順序相同則返回json,若優先順序不同則返回優先順序高的型別
詳見下表:
Accept頭 |
返回型別 |
---|---|
application/json |
json |
application/xml |
xml |
application/xml,application/json |
json |
application/json,application/xml |
json |
application/xml;q=1.0,application/json;q=1.0 |
json |
application/xml;q=0.9,application/json;q=0.9 |
json |
application/xml;q=1.0,application/json;q=0.9 |
xml |
application/xml;q=0.9,application/json;q=1.0 |
json |
為了使其能正確返回json資料需要進行如下操作:
1.在程式裡找到webapiconfig.cn如圖:
2.新增如下程式碼:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// New code:
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
}
好,在重新除錯就不會出現Extjs無法解析什麼什麼的錯誤了.唉,這個問題困擾了我一天,總是想辦法怎樣去重新把資料轉換成json,殊不知問題這麼容易被解決了 隨後我會把Extjs+webapi+Mvc4+EFmodel的事例與大家分享,敬請期待