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() {
  • 走起
  1. 注意 Accept,Content-Type , swagger 选择Response Content Type 受影响的是 request headers
  2. 当设置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>
  • 再次走起
  1. 浏览器



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
  1. swagger 走一波

4. 再来看下jQ 下ajax的情况

  • 走起
  1. 默认情况(不支持xml)

  2. 配置支持xml

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

总结下

  • 浏览器
  1. 在浏览器地址栏访问的情况下request header Accept:text/html, application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  2. 规则,从左到右依次匹配,推断返回内容类型.最明确的优先匹配.本文中xml,json 都支持下,优先选择xml
  • jQ ajax ,
  1. 默认情况下request header accept:*/* jQ会智能推断.如上来看json优先级较高
  2. 通过 dataType 设置 request header accept 类型
  • 开发层面的建议
  1. 涉及到跨组,跨部门,前后端分离的情况借用swagger媒介来沟通api接口情况
  2. 如有xml,json多格式支持的话,设置swagger Response Content Type 来达到多类型支持
  3. 优先使用json格式交互数据

--

  1. 有误的地方欢迎指正,交流

参考链接

  1. 匹配规则 http://blog.csdn.net/blueheart20/article/details/45174399
  2. 406 http://www.ruanyifeng.com/blog/2014/05/restful_api.html
  3. Http报头Accept与Content-Type的区别 http://www.cnblogs.com/-lzb/articles/5035629.html
  4. 推荐优先使用json https://www.cnblogs.com/jaxu/p/7908111.html#a_1
  5. jQ ajax dataType https://api.jquery.com/jquery.ajax/#jQuery-ajax-settings

api接口写好了?想过(Accept,Content-Type)?返回类型json|xml?的更多相关文章

  1. ASP.NET Web API 通过参数控制返回类型(JSON|XML)

    一个很实用的技巧,可以在访问web api服务的时候指定返回数据的格式类型,比如 json 或者 xml. 因为 web api 默认返回的是XML格式,但是现在json 比较流行,同时网上也有其他的 ...

  2. 在Winform混合式框架中整合外部API接口的调用

    在我们常规的业务处理中,一般内部处理的接口多数都是以数据库相关的,基于混合式开发的Winform开发框架,虽然在客户端调用的时候,一般选择也是基于Web API的调用,不过后端我们可能不仅仅是针对我们 ...

  3. 举例说明如何使用【聚合数据】的API接口

    0 注册[聚合数据]的账号 登陆www.juhe.cn,如图,如果没有账号,注册一个(手机号或者邮箱注册),如果有直接登陆即可. 1 搜索所需的API接口 找到聚合数据主页,在搜索框输入你想搜索的AP ...

  4. 利用postman进行api接口开发

    场景: api接口开发时,经常使用一些工具来帮助设计开发.Yapi主要是在设计阶段进行api接口设计,统一前后端参数请求和返回体:swagger主要在开发阶段,用来显示实际上后端开发进度和接口情况:p ...

  5. C# web api 返回类型设置为json的两种方法

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  6. Web API 2:Action的返回类型

    Web API 2:Action的返回类型 Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 ...

  7. ASP.NET Web API 2:Action的返回类型

    Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 基于上面几种不同的返回类型,Web API ...

  8. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)

    上篇文章说到接口安全的设计思路,如果没有看到上篇博客,建议看完再来看这个. 通过园友们的讨论,以及我自己查了些资料,然后对接口安全做一个相对完善的总结,承诺给大家写个demo,今天一并放出. 对于安全 ...

  9. 第一次写Web API接口

    API是什么?只知道是网络接口,具体怎么写?不会!如何调用?不会!那怎么办? 第一次的经历~~ 需求:为其他项目提供一个接口 功能:为项目提供询盘信息和商家信息,格式为Json字符串 拿过来,就开始做 ...

随机推荐

  1. java多线程编程核心技术——第七章补漏拾遗

    本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...

  2. 后台程序处理 (一)python asyncio 协程使用

    由于脚本需要在完成事件处理后N秒检查事件处理结果,当执行失败时再执行另一个事件处理. 想要最小化完成这个功能.同时在第一时间就将执行完毕的结果反馈给接口. 因此想到使用协程. 使用之前先翻阅了一下现有 ...

  3. ZKWeb网页框架2.0正式发布

    2.0.0更新的内容有 更新框架要求 框架要求从 netstandard 1.6 升到 netstandard 2.0 框架要求从 netcoreapp1.1 升到 netcoreapp2.0 更新引 ...

  4. 《Spark大数据处理:技术、应用与性能优化》【PDF】 下载

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  5. Android Studio 提示android.support.v4不存在的解决方法

    最近想学习仿QQ列表的侧滑删除功能,看完资料之后,发现有一堆错误,看了一下,说是不存在android.support.v4包不存在,浪费了一个多小时,终于是找到了解决方法,便是记录下来 打开file- ...

  6. iOS 正则表达式使用(转)

    1/ 教程一:认识正则表达式 .http://deerchao.net/tutorials/regex/regex.htm#mission 表7.尚未详细讨论的语法 代码/语法 说明 \a 报警字符( ...

  7. Python Web框架

    本节对Python Web框架学习 一.MTVModel: 存放所有数据库相关文件Template:模板文件,存放html文件View: 业务处理,即函数文件 二.MVCmodel: 存放数据库相关文 ...

  8. sharepreference使用教程

    1.应用 SharePreference主要用于保存一些数据,比如用户登录后的user_id,user_mobile,这样就可以做自动登录了,每次判断SharePreference中有没有数据,有的话 ...

  9. ABP 找不到版本为 (>= 1.0.0-preview1-27891) 的包 Microsoft.AspNetCore.SignalR 错误

    错误描述: 下载ABP模板项目3.4.1的版本(当前最新版本),编译加载nuget包Microsoft.AspNetCore.SignalR时会报如下错误: 严重性     代码         说明 ...

  10. bzoj 3597: [Scoi2014]方伯伯运椰子

    Description Input 第一行包含二个整数N,M 接下来M行代表M条边,表示这个交通网络 每行六个整数,表示Ui,Vi,Ai,Bi,Ci,Di 接下来一行包含一条边,表示连接起点的边 Ou ...