最近開始使用WebAPI,上手很容易,而後有些疑惑html
1.WebAPI默認返回什麼數據類型,json仍是xml?
2.怎麼修改WebAPI的返回數據類型
,我用IE瀏覽器請 求返回的數據都是JSON格式的,用Firefox和Chrome返回數據格式是XML,而後本身用HttpWebRequest請求返回的是JSON格 式的,我就納悶了,咋一樣的程序、一樣的配置文件,輸出數據格式爲啥還帶不同的,就算你默認輸出json或者xml均可以理解,咋還不一樣瀏覽器,輸出格 式不一樣,通過一番研總算搞懂了緣由web
通過測試發現使用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瀏覽器的請求頭chrome
瀏覽器 | 返回數據格式 | accept請求頭 |
IE | json | text/html, application/xhtml+xml, */*json |
Firefox | xml | text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,*/*api |
Chrome | xml | text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8,*/*瀏覽器 |
繼續進行以下測試app
1.只發送accept:application/json,結果返回了json測試
2.只發送accept:application/xml,結果返回了xmlspa
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的事例與你們分享,敬請期待