当扩展名为.json时,AJAX工作,但当扩展名为.html时则不行

时间:2015-12-25 12:41:58

标签: json ajax spring-mvc

所以我有一个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时,它甚至没有达到我的方法。

1 个答案:

答案 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", "*/*");