Ajax请求接口报错“406 (Not Acceptable)”
Ajax请求接口下发短信验证码,短信发送成功,接口回执接受失败,F12查看出现错误406
浏览器截图
代码示例
后台接口
@RequestMapping(value = "/page/serviceCart/sendSmsCheckCode.html")
@ResponseBody
public Map<String,Object> smsXxs(String phone, HttpServletRequest request) throws ClientException {
Map<String,Object> map = new HashMap<>();
String code = CodeUtil.generateVerifyCode(6);
String TemplateParam = "{\"code\":\""+code+"\"}";
String TemplateCode = "SMS_163848296";
SendSmsResponse response = SmsXsk.sendSms(phone,TemplateParam,TemplateCode);
map.put("verifyCode",code);
map.put("phone",phone);
if( response.getCode().equals("OK")) {
map.put("isOk","OK");
}
return map;
}
Ajax
function getSmsCheckCode() {
$.ajax({
url:'serviceCart/sendSmsCheckCode.html',
type:'post',
data:'phone='+userPhone,
success:function(rs){
if(rs){
$("#buttonId").attr("disabled",false);
alert(rs);
}
}
});
}
查阅资料了解到:
406是HTTP协议状态码的一种,表示无法使用请求的特性来响应请求的网页。一般指客户端浏览器不接受所请求页面的MIME类型。
基于我们使用的是ssm框架,注解使用“@ResponseBody”锁定问题大概存有三种
- json所依赖的jar包不存在。
- spring和jackson版本对不上
- 对应请求的后缀是.html的。
结合问题所在,锁定是请求地址的问题
问题解决
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
在web.xml中增加响应后缀配置:.action配置
注:
请求的后缀为.html,会欺骗浏览器当做一个静态网页来解析,是一个简单的SEO优化。但是代码使用了@ResponseBody,返回数据后缀是.json,代码的映射器后缀又是.html;最后浏览器收到数据不知该以哪种类型数据来进行解析,所以就会报406状态码。解决方法将web.xml中的映射器的url-pattern的后缀改为其他的.action,.do或者其他都可以(项目开始很久,不方便更改,在其基础上增加一段响应后缀配置也可以<亲测好使>)。