文档章节

Spring MVC + JSON = 406 Not Acceptable

萧十一郎君
 萧十一郎君
发布于 2016/01/18 13:35
字数 979
阅读 1788
收藏 2

在开发接口时发现了一个很好玩的问题,两个接口均是restful形式,参数在URL路径中传递,返回结果形式均为json,但是在接口测试时,一个接口正常,另一个接口报错:The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.本文来分析一下其中的原因。

  先介绍一下出错的接口情况,接口代码如下:

/**
 * 验证email是否可用
 * @param email
 * @return
 */
@ResponseBody
@RequestMapping(value = "/emailCheck/{email}", method = RequestMethod.GET)
@ApiOperation(value = "验证email是否可用", httpMethod = "GET", response = ApiResult.class, notes = "验证email是否可用")
public ApiResult checkEmailValid(@ApiParam(required = true, name = "email", value = "待校验的电子邮箱") @PathVariable String email) throws Exception{
    UcUserContact userContact = ucUserContactmanager.getByEmail(email);
    ApiResult<String> result = new ApiResult<String>();
    if (userContact != null){
        result.setData("0");//用户名不可用
    }else{
        result.setData("1");//用户名可用
    }
    result.setCode(ResultCode.SUCCESS.getCode());
    return result;
}

  通过Swagger生成的接口描述如下图所示:

  在上图的表单中将email的值设置为456213@qq.com,发起对接口的测试请求,界面返回结果如下图:

  服务端控制台异常代码如下:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

  细心的读者可能会发现,在本文第二张图中Curl中的header设置为'Accept: text/html',这和本文提出的问题有没有关联呢?下面我们再做一次实验,将email的值设置为456213,再次发送测试请求,界面返回结果如下图:

  小伙伴们现在心里有疑问了吧?为什么header中的Accpet值会不一样?为什么这次能过正常响应呢?让我们回想一下响应码406的意思——Not Acceptable,即请求数据类型与返回数据类型不匹配。我原本请求返回html数据,你服务端却给我返回json数据,我当然Not Acceptable啦!
  我们已经很清楚的知道,restful接口返回结果均使用@ResponseBody注解转为json格式,如果客户端请求json数据,接口肯定能正常响应;如果客户端请求其他形式数据,我们的接口也只能响应json数据,这样子就出现本文讨论的问题了。
  进一步讨论,为什么修改参数之后,header中Accept的值不一样了呢?让我们好好审视一下Request URL吧!

http://localhost:8083/arrow-api/users/emailCheck/456213%40qq.com

  这个URL是以.com结尾,其形式为使用.com顶级域名的网址,所以客户端默认在这种请求的头部设置'Accept: text/html',因为这种形式的地址一般都是对网页的请求。不信,你可以试试把该url的后缀.com去掉,再次测试请求。我猜,一定可以正常响应。

  那碰到这种情况怎么办呢?其实,很简单!只要不使用restful的形式绑定参数即可。我是这么修改的:

/**
 * 验证email是否可用
 * @param email
 * @return
 */
@ResponseBody
@RequestMapping(value = "/emailCheck", method = RequestMethod.GET)
@ApiOperation(value = "验证email是否可用", httpMethod = "GET", response = ApiResult.class, notes = "验证email是否可用")
public ApiResult checkEmailValid(@ApiParam(required = true, name = "email", value = "待校验的电子邮箱") @RequestParam String email) throws Exception{
    UcUserContact userContact = ucUserContactmanager.getByEmail(email);
    ApiResult<String> result = new ApiResult<String>();
    if (userContact != null){
        result.setData("0");//用户名不可用
    }else{
        result.setData("1");//用户名可用
    }
    result.setCode(ResultCode.SUCCESS.getCode());
    return result;
}

  让我们来看下测试结果吧!

  注意看上图中的Curl和Request URL哦!你应该明白了!

文章作者: xiaohui249
本文链接: http://javatech.wang/index.php/archives/77/
版本所有 ©转载时必须以链接形式注明作者和原始出处

本文转载自:http://javatech.wang/index.php/archives/77/

萧十一郎君

萧十一郎君

粉丝 64
博文 34
码字总数 19501
作品 0
昌平
程序员
私信 提问
加载中

评论(1)

夫复何求
夫复何求
学习了~~~刚从坑了爬出来
spring mvc 4.1 返回json报406错误的解决办法

spring mvc 4.1 返回json报406错误的解决办法 浏览器访问,报 The resource identified by this request is only capable of generating responses with characteristics not acceptable ac......

赵占涛
2014/11/01
9.6K
0
Spring4 MVC json问题(406 Not Acceptable)

为了配合ECS 把原来房子BAE中的代码重新构建,发现发送JSON数据与EXTJS不配合,找了很久发现CSDN上有篇文章正好解决了,庆幸有互联网。 用的是第二中方法 原帖:http://blog.csdn.net/woshiw...

夏碌冬藏
2014/08/03
11K
1
SpringMVC 3.2.* json 406

今天项目请求json时报了这个诡异的且从来没有遇到到的错误:The resource identified by this request is only capable of generating responses with characteristics not acceptable accor......

耀子
2016/06/23
56
0
spring mvc 返回httpstate 406

spring 版本:3.2.4 跟踪到spring mvc中查看到的异常: org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation spring中抛出异常的方法:......

Lofo
2013/10/20
9.2K
1
spring 4.x下让http请求返回json串

当前很多应用已经开始将响应返回为json串,所以基于springframework框架开发的服务端程序,让响应返回json字符串成为了一种常用手段。 这里介绍一下如何在spring-MVC框架下方便快捷的返回jso...

gaolu
2015/11/28
297
1

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部