所以我有一个ajax请求。当我使用.html
时,如下所示。我收到了:
Failed to load resource: the server responded with a status of 406 (Not Acceptable)
当我使用.json
时,我收到了正确的输出。为什么它不适用于.html
$("input[value = 'Add Type Targets']")
.click(
function() {
var promise = $
.ajax({
url : '/MyRoot/budget/myUrl.html',
type : 'GET',
beforeSend : function(
xhr) {
xhr
.setRequestHeader(
"Accept",
"application/json");
xhr
.setRequestHeader(
"Content-Type",
"application/json");
}
});
promise
.done(function(data) {
someCode
}
});
});
关于我的方法
@RequestMapping(value = "/myUrl", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody List<String> getData() {
return staticDataService.getData();
}
我添加了jackson-mapper-asl-1.9.10.jar和jackson-core-asl-1.9.10.jar。
是不是因为.html扩展名我的响应标头被改变了。实际上,当我使用.html时,它甚至没有达到我的方法。
答案 0 :(得分:1)
HTTP错误代码406(不是可接受)表示您的HTTP请求指定结果必须是某种类型。 在您的代码中,您明确提到您只接受JSON结果。
$.ajax({
url : '/MyRoot/budget/myUrl.html',
type : 'GET',
beforeSend : function(xhr) {
xhr.setRequestHeader( "Accept", "application/json");
...
当服务器看到扩展名为.json的文件时,它会自动为其提供application / json内容类型,而.html文件则为text / html内容类型。 由于这些非常不同,您会看到406错误。
由于您实际上正在返回JSON,我建议您也将其用于扩展。这不仅有助于防止其他开发人员混淆,还可以防止您“与系统作战”。
如果由于某种原因确实需要HTML扩展,可以尝试强制响应内容类型为application / json。由于这种基于扩展的内容类型通常由服务器(IIS,Apache等)添加,因此如果您可以覆盖它,则它取决于您的开发堆栈。 在ASP.NET中,您将使用以下内容显式设置标头,但我不能确定这是否会覆盖IIS中的设置。
Response.ContentType = "application/json"
如果这不起作用,你也可以改变你的AJAX调用,使其接受响应更加宽容。
xhr.setRequestHeader( "Accept", "*/*");