WebAPI返回數據類型解惑 以及怎樣解決Extjs沒法解析返回的xml

最近開始使用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的事例與你們分享,敬請期待
相關文章
相關標籤/搜索