文档章节

Spring MVC + JSON = 406 Not Acceptable

萧十一郎君
 萧十一郎君
发布于 2016/01/18 13:35
字数 979
阅读 1787
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

JS其他类型值转化为Boolean类型规则

本文转载于:专业的前端网站➤JS其他类型值转化为Boolean类型规则 由于最近在笔试的时候,发现好多关于其他类型转化为Boolean类型的题目,因此总结一下! 一、String类型转化为Boolean 1.转化...

前端老手
30分钟前
4
0
EurekaClient自动装配及启动流程解析

在上篇文章中,我们简单介绍了EurekaServer自动装配及启动流程解析,本篇文章则继续研究EurekaClient的相关代码 老规矩,先看spring.factories文件,其中引入了一个配置类EurekaDiscoveryClie...

Java学习录
36分钟前
5
0
析构函数是否必须为虚函数?为何?

p517 在C++中,基类指针可以指向一个派生类的对象。如果基类的析构函数不是虚函数,当需要delete这个指向派生类的基类指针时,就只会调用基类的析构函数,而派生类的析构函数无法被调用。容易...

天王盖地虎626
36分钟前
5
0
【TencentOS tiny】深度源码分析(7)——事件

引言 大家在裸机编程中很可能经常用到flag这种变量,用来标志一下某个事件的发生,然后在循环中判断这些标志是否发生,如果是等待多个事件的话,还可能会if((xxx_flag)&&(xxx_flag))这样子做...

杰杰1号
40分钟前
6
0
聊聊nacos client的ServerHttpAgent

序 本文主要研究一下nacos client的ServerHttpAgent HttpAgent nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/http/HttpAgent.java public interface HttpAgent { ......

go4it
46分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部