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. Eclipse上Maven环境配置使用 (全)

    Eclipse上Maven环境配置使用 (全) 1. 安装配置Maven: 1.1 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. ...

  2. OpenCASCADE 公众号

    OpenCASCADE 公众号 eryar@163.com 今天也注册了一个微信公众号,以后会在微信公众号中发表OpenCASCADE学习文章,Blog会与微信公众号同步.下面是微信公众号二维码,欢迎 ...

  3. lua中怎么替换掉字符串中的$^特殊字符?

    Lua 常规替换字符串如何替换 s = string.gsub("Lua is good", "good", "bad") print(s) ...

  4. Django的设计模式

    MVC模式 MVC将应用程序分解为三个组成部分:mode(模型).view(视图).control(控制器),其中: M 管理应用程序的状态(通常存储到数据库中),并榆树改变状态的行为(或者叫&quo ...

  5. Principle-初步认识(简介)

    Principle官网 探究了一下 . 呃--作出了下边这玩意 做的好的是这样的,瞬间把自己给菜了,给大家看看,设计需要UI功夫啊 把这个用上你的界面就搞基了,图形在水平.垂直上的动态效果(*.*) ...

  6. Mybatis-Oralce批量插入方法

    mybatis-Oralce 中批量插入方法一:<insert id="insertBatchSelective" parameterType="java.util ...

  7. Visual Studio 2017 : client version 1.22 is too old

    使用Vs2017 编译 eShopOnContainers-ServicesAndWebApps 时,报了错误: Microsoft.DotNet.Docker.CommandLineClientEx ...

  8. 【model模型传入view的数据类型错误】传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[MapScience.PovertyAlleviation.Web.Models.Qu

    出现这个问题的原因是控制器中传给view的数据类型与View中设置的model类型不一致导致,比如控制器返回的IList类型的,而你在View里面model设置的是IEnumerable<> ...

  9. Linux中dos2unix批量转换

    有时候遇到多层目录下的文件格式需要转换,dos2unix 没有-r之类的递归指令,所以需要与find还有管道结合. find -type f | xargs dos2unix -o

  10. phpexcel用法(转)

    .php导出excel(多种方法) (2013-03-23 15:44:02) 转载▼   分类: php 基本上导出的文件分为两种: 1:类Excel格式,这个其实不是传统意义上的Excel文件,只 ...