• 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数据

    image

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

    image

    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格式)。
    

    image

    3. 配置 spring boot RESTful API 支持xml

    • pom
      <dependency>
                <groupId>com.fasterxml.jackson.dataformat</groupId>
                <artifactId>jackson-dataformat-xml</artifactId>
      </dependency>
    
    • 再次走起
    1. 浏览器

    image
    2. curl

    image
    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 走一波
      image

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

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

    2. 配置支持xml
      image

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

    总结下

    • 浏览器
    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
  • 相关阅读:
    Apache Commons 工具集使用简介
    程序员最核心的竞争力是什么?
    开发FTP不要使用sun.net.ftp.ftpClient
    Eclipse和MyEclipse工程描述符.classpath和.project和.mymetadata详解(转)
    MAC OS X显示.开头的文件_苹果操作系统显示隐藏文件命令
    再探二分查找
    二叉树的各种操作
    【java】求两个字符串的最长公共子串
    【Java】数组不能通过toString方法转为字符串
    【C语言】数组名传递给函数,数组的sizeof变为4的原因
  • 原文地址:https://www.cnblogs.com/dayou123123/p/8298917.html
Copyright © 2020-2023  润新知