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或者其他都可以(項目開始很久,不友善更改,在其基礎上增加一段響應字尾配置也可以<親測好使>)。
查閱相關資料連結
- https://blog.csdn.net/zhangtxsir/article/details/79521810
- https://blog.csdn.net/lkwan123/article/details/73385025