|

最近在使用webapi,浏览器访问webapi,默认返回的是xml格式,我想这个返回的数据格式,应该是用户可以自定义的,可以让服务器返回xml格式或者json格式,而不是服务器代码去配置!
虽然服务器代码可以配置,但是,我觉得着并不是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 只出现在Request中
其含义是: 浏览器端可以接受的媒体类型
例如 Accept: text/html 代表浏览器可以接受服务器回发的类型为 text/html 也就是我们常说的html文档
如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable)
通配符 * 代表任意类型
例如 Accept: */* 代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
又例如 Accept: text/* 代表所有的text的子类都是可以被接受的
Accept可以支持用,分隔的多个类型
例如 Accept: audio/*; q=0.2, audio/basic 的大意是, 浏览器比较喜欢audio/basic的媒体类型, 不过如果没有这个类型的话 其他的audio类型也可以
在这里出现了一个q=0.2 , 这是一个代表关联程度的值,默认值是一,按照从大到小排列
例如 Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c
可接受的类型优先级如下
1) text/html text/x-c
2)text/x-dvi
3)text/plain
q是一个0-1之间的数值, q的默认值是1, q=0代表不可接受(non acceptable)
最后,测试结果:
浏览器 | 返回格式 | accept请求头 | ie | json | text/html, application/xhtml+xml, */* | Chrome | xml | text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 | Firefox | 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 |
如下图:
|
上一篇:python3实现并发访问水平切分表下一篇:.Net MVC 实现长轮询
|