【问题标题】:406 error when sending JSON to Spring Controller将 JSON 发送到 Spring Controller 时出现 406 错误
【发布时间】:2016-03-31 01:26:22
【问题描述】:

我有一个这样的 jQuery ajax 调用:

            $.ajax({
            type: "post",
            url: url,
            data: JSON.stringify(formSubmit),
            contentType: "application/json",
            dataType: "json",
            success: function(xhr,status) {
                console.log("Return Data:"+xhr.responseText)
            });

我的控制器如下所示:

@RequestMapping(value = "/doIt", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@ResponseBody 
public MyObject activityPerformed(HttpServletRequest request, HttpServletResponse response,  @RequestBody String jsonData) {
    logger.debug("JSON INPUT:"+jsonData);
    MyObject o = new MyObject("STUFF");
    return o;
}

这会引发 406 错误。我可以在我的浏览器中看到我的响应标头中有这个:

Content-Type:"text/html;charset=utf-8"

我认为映射的产生部分应该已经修复了。

当我删除 ajax 调用的“contentType”时,我没有收到 406 错误,而是 URLEncoded 中的 jsonData 参数。不,我认为我可以进行解码,但我认为这不是“正确的”。

那么如何在 ajax 调用中将非 URL 编码的 JSON 发送到没有 contentType: "application/json" 的控制器?

或者如何设置控制器响应的 contentType?

【问题讨论】:

  • 您检查过服务器安全日志吗?当请求违反 mod_security 规则时,Apache 会生成错误。所以可能不是你的 jsonData 请求导致了错误。
  • 我使用的是tomcat 8.0.30
  • 另一个与您的设置有相同问题的人:stackoverflow.com/questions/7462202/…。我不确定您的设置是什么,但这可能有助于引导您找到错误的来源,以便您知道要提供哪些详细信息。他们没有使用与您相同的请求标头,但答案可能会告诉您前进的方向。

标签: javascript jquery json ajax spring


【解决方案1】:

Spring 负责发回 406。The Spring reference documentationJavaDoc 将有助于阐明这一点。

来自参考文档:

[关于 produces 字段]仅当 Accept 请求标头与这些值之一匹配时,该请求才会被匹配。

如果您将正确的 Accept request header (sec 14.1)application/json;charset=UTF-8 的值)添加到您的 ajax 请求中,我希望您不再获得 406 HTTP 状态代码。 p>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多