api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?
起因:
- A,B. A调用B提供的api接口.
- A:为毛你的接口返回的是xml格式的(浏览器访问)?给个json行不行?
- B:没问题啊,我们自己的程序一直在用
测试
1. 测试demo
- 新建一个spring boot RESTful API项目
 
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public User index() {
        List<String> testList = new ArrayList<String>();
        testList.add("aa");
        testList.add("bb");
        User user=new User();
        user.setName("Grace");
        user.setTestList(testList);
        return user;
    }
- 浏览器地址栏访问,返回结果没问题,json数据
 

- 默认是不支持xml的,请求头类型application/xml 无返回数据
 

2.更直观点看,spirng boot 集成swagger2 并设置 Response Content Type 支持xml,json类型
- pom
 
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.2.2</version>
        </dependency>
- produces
 
//默认为 */*
//支持xml,json 设置 produces = "application/xml,application/json")
@ApiOperation(value = "user", notes = "note", produces = "application/xml,application/json")
@RequestMapping(value = "/hello", method = RequestMethod.GET)
    public User index() {
- 走起
 
- 注意 Accept,Content-Type , swagger 选择Response Content Type 受影响的是 request headers
 - 当设置xml类型时 拿不到数据,状态码406
 
 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

3. 配置 spring boot RESTful API 支持xml
- pom
 
  <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
  </dependency>
- 再次走起
 
- 浏览器
 

2. curl

2. 注意对比不支持xml的截图 request headers ,内容一样本次为xml类型数据
3. 服务器根据accept类型(jq ajax 也会推断下面说),从左到右一次匹配,推断返回内容类型 application/xhtml+xml 第二位匹配
4. 即匹配规则为:最明确的优先匹配。
 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
- swagger 走一波

 
4. 再来看下jQ 下ajax的情况
- 走起
 
默认情况(不支持xml)

配置支持xml

$.get(xx,xx,xx,dataType) dataType 默认的情况(*/*),按api文档说的jQ会智能推断

总结下
- 浏览器
 
- 在浏览器地址栏访问的情况下
request header Accept:text/html, application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 - 规则,从左到右依次匹配,推断返回内容类型.最明确的优先匹配.本文中xml,json 都支持下,优先选择xml
 
- jQ ajax ,
 
- 默认情况下
request header accept:*/*jQ会智能推断.如上来看json优先级较高 - 通过 
dataType设置request header accept类型 
- 开发层面的建议
 
- 涉及到跨组,跨部门,前后端分离的情况借用swagger媒介来沟通api接口情况
 - 如有xml,json多格式支持的话,设置swagger Response Content Type 来达到多类型支持
 - 优先使用json格式交互数据
 
--
- 有误的地方欢迎指正,交流
 
参考链接
- 匹配规则 http://blog.csdn.net/blueheart20/article/details/45174399
 - 406 http://www.ruanyifeng.com/blog/2014/05/restful_api.html
 - Http报头Accept与Content-Type的区别 http://www.cnblogs.com/-lzb/articles/5035629.html
 - 推荐优先使用json https://www.cnblogs.com/jaxu/p/7908111.html#a_1
 - jQ ajax dataType https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings
 
api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?的更多相关文章
- ASP.NET Web API 通过参数控制返回类型(JSON|XML)
		
一个很实用的技巧,可以在访问web api服务的时候指定返回数据的格式类型,比如 json 或者 xml. 因为 web api 默认返回的是XML格式,但是现在json 比较流行,同时网上也有其他的 ...
 - 在Winform混合式框架中整合外部API接口的调用
		
在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们 ...
 - 举例说明如何使用【聚合数据】的API接口
		
0 注册[聚合数据]的账号 登陆www.juhe.cn,如图,如果没有账号,注册一个(手机号或者邮箱注册),如果有直接登陆即可. 1 搜索所需的API接口 找到聚合数据主页,在搜索框输入你想搜索的AP ...
 - 利用postman进行api接口开发
		
场景: api接口开发时,经常使用一些工具来帮助设计开发.Yapi主要是在设计阶段进行api接口设计,统一前后端参数请求和返回体:swagger主要在开发阶段,用来显示实际上后端开发进度和接口情况:p ...
 - C# web api 返回类型设置为json的两种方法
		
每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...
 - Web API 2:Action的返回类型
		
Web API 2:Action的返回类型 Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 ...
 - ASP.NET Web API 2:Action的返回类型
		
Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 基于上面几种不同的返回类型,Web API ...
 - 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
		
上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...
 - 第一次写Web API接口
		
API是什么?只知道是网络接口,具体怎么写?不会!如何调用?不会!那怎么办? 第一次的经历~~ 需求:为其他项目提供一个接口 功能:为项目提供询盘信息和商家信息,格式为Json字符串 拿过来,就开始做 ...
 
随机推荐
- spring mvc获取绝对路径的几种方法
			
1.首先如果是在一个controller方法中,则很简单,直接用下面语句. @RequestMapping("categoryHome") public ModelAndView ...
 - ViewPager+Fragment 懒加载
			
转载于: 作者:尹star链接:http://www.jianshu.com/p/c5d29a0c3f4c來源:简书 ViewPager+Fragment的模式再常见不过了,以国民应用微信为例,假 ...
 - ERR Unsupported CONFIG parameter: notify-keyspace-events; nested exception is redis.clients.jedis.exceptions.JedisDataException
			
异常信息 时间:2017-04-05 15:53:57,361 - 级别:[ WARN] - 消息: [other] The web application [ROOT] appears to hav ...
 - 微信小程序使用场景延伸:扫码登录、扫码支付
			
微信小程序使用场景延伸:扫码登录.扫码支付 小程序最适合的使用场景有哪些?相比大家能列举出来很多,但这个场景,大家可能多数没想到_^ 笔者团队近期接到了一个PC项目:转转游戏租号PC官网,该项目要求在 ...
 - iOS 类似朋友圈的图片浏览器SDPhotoBrowser
			
SDPhotoBrowser.Demo 1.在文件SDBrowserImageView.m中有用SDWebImage到网络加载图片 需要的注释去掉即可 #import "ViewContro ...
 - 一些常用的vim编辑器快捷键:
			
一些常用的vim编辑器快捷键: h」.「j」.「k」.「l」,分别控制光标左.下.上.右移一格. 按「ctrl」+「b」:屏幕往“后”移动一页. 按「ctrl」+「f」:屏幕往“前”移动一页. 按「c ...
 - Boost Coroutine2 - stackful coroutine简介
			
协程可以很轻量的在子例程中进行切换,它由程序员进行子例程的调度(即切换)而不像线程那样需要内核参与,同时也省去了内核线程切换的开销,因为一个协程切换保留的就是函数调用栈和当前指令的寄存器,而线程切换需 ...
 - 第五节  suid/ sgid /sbit /which /locate / find /stat / ln / uname -a
			
复习上节课内容(重点记录)1.chown -R 递归修改目录下包含子目录和子目录下的文件的属组2.chmod -R 递归修改目录下包含子目录和子目录下的文件的权限 ================== ...
 - Linux第九讲随笔  -进程管理 、ps aux 、
			
Linux第九讲1,进程管理 Linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程,进程是系统分配各种资源,进程调度的基本单位. 怎么查看进程 一.ps ...
 - crm踩坑记(三)
			
React 如何同步更新state 由于setState方法是异步的,而通常很多时候在一个生命周期里更新state后需要在另一个生命周期里使用这个state. 下面介绍几个方法 // 1 this.s ...