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的事例与大家分享,敬请期待
最新文章
- Sphinx 全量索引加实时索引
- http 超文本传输协议
- Flex 播放视频
- Softmax 回归原理介绍
- PCB的阻抗控制
- PDO--PHP Data Objects
- 关于odbc连接orcal,用户名密码大小写敏感问题
- R语言笔记5--读数据
- Django 系列博客(十一)
- Python中自定义filter用法
- js生成二维码 qrcode
- DLL 函数中使用结构体指针作函数参数(C# 调用 C++ 的 DLL)
- CSS的基本语法
- Confluence 6 数据库表-内容(Content)
- 关于Androidstudio无法获取到所有的SDk版本,需要挂国内镜像的问题
- 关于升级程序版本时version与build修改的问题
- shell 特殊变量详解
- SSH框架搭建步骤总结以及Hibernate二级缓存,查询缓存
- $.ready和onload 区别
- Ext3.4-EXT之嵌套表格的实现
热门文章
- C/C++ 浮点数比较问题
- 洛谷 2921 记忆化搜索 tarjan 基环外向树
- java.lang.ClassNotFoundException: org.jaxen.JaxenException
- 小贝_mysql三种子查询
- 【笨木头Lua专栏】基础补充02:函数的几个特别之处
- codeblocks的c程序目录结构与执行过程
- linux 终端提示符
- Install Rails on ubuntu 12.04 LTS
- xBIM 基础16 IFC的空间层次结构
- Codeforces 703D Mishka and Interesting sum 离线+树状数组