zoukankan      html  css  js  c++  java
  • 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的事例与大家分享,敬请期待
  • 相关阅读:
    Django框架学习-Model进阶用法
    jquery获取元素的所有宽高(包括内边距和外边距)
    django group_by
    jquery如何判断滚动条滚到页面底部并执行事件
    web ajax跨域问题解决方案
    django ckeditor的使用方法
    django自带User管理中添加自己的字段方法
    如何在django中使用多个数据库
    使用django-mssql时候报pythoncom模块不存在
    centos命令行常用操作
  • 原文地址:https://www.cnblogs.com/jameslif/p/3210030.html
Copyright © 2011-2022 走看看