1. 程式人生 > 其它 >WebAPI返回資料型別解惑 以及怎樣解決Extjs無法解析返回的xml

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的事例與大家分享,敬請期待