架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 15331|回复: 3

[WebAPI] WebAPI 自定义返回数据格式

[复制链接]
发表于 2017-11-30 11:00:16 | 显示全部楼层 |阅读模式
最近在使用webapi,浏览器访问webapi,默认返回的是xml格式,我想这个返回的数据格式,应该是用户可以自定义的,可以让服务器返回xml格式或者json格式,而不是服务器代码去配置!

QQ截图20171130104554.jpg

虽然服务器代码可以配置,但是,我觉得着并不是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


如下图:
QQ截图20171130104604.jpg QQ截图20171130104748.jpg QQ截图20171130104807.jpg




上一篇:python3实现并发访问水平切分表
下一篇:.Net MVC 实现长轮询
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2017-11-30 11:06:08 | 显示全部楼层
厉害了   以前发现有这种情况 但是没想为什么
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 2017-11-30 11:07:36 | 显示全部楼层
QWERTYU 发表于 2017-11-30 11:06
厉害了   以前发现有这种情况 但是没想为什么

建议禁止返回xml格式,因为,有些情况下,返回json格式正常,返回xml格式就会抛出异常

例如:返回值是object的情况下,返回json格式正常,返回xml格式就报错
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2018-4-25 08:50:44 | 显示全部楼层
讲的很详细,还有知识点,感谢,已收藏
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-16 20:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表