尝试在Java Spring中获取JSON时为什么会出现406错误?

时间:2018-07-23 16:32:41

标签: java json spring controller response

当我通常使用Java Spring作为返回JSON数据的控制器端点时,我的返回类型通常为String;我将toString()的JSON对象放入我的JavaScript中进行解析。最近,我在某处读到不是“正确”的方法(尝试遵循最佳实践和准则)。我正在启动一个新项目,该项目的返回类型为JSON对象(相关性为org.json)。

当我尝试在浏览器中访问端点时,出现406错误,描述为“此请求标识的资源只能根据请求“ accept”标头生成特性不可接受的响应”。

这是我的终端现在的样子:

@RequestMapping(value = "/api/get-items", method = {RequestMethod.GET, RequestMethod.POST}, headers = "Accept=application/json")
@ResponseBody
public JSONObject doGetItems(HttpServletRequest request, HttpServletResponse response) {
    JSONObject data = new JSONObject();
    JSONArray items = new JSONArray();
    JSONObject item1 = new JSONObject().put("id", 123);
    JSONObject item2 = new JSONObject().put("id", 456);
    JSONObject item3 = new JSONObject().put("id", 789);
    items.put(item1).put(item2).put(item3);
    data.put("data", items);
    return data;
}

如何使它工作并返回JSON?还是我应该返回JSON对象的字符串化版本,而且我一直都在正确地执行此操作?

更新

首先,我尝试在headers批注中取出@RequestMapping参数。我仍然出现406错误。

然后,我尝试更改/添加@RequestMapping批注中的参数,也没有运气。这就是我尝试将其更改为:

@RequestMapping(value = "/api/get-items",
                method = {RequestMethod.GET, RequestMethod.POST},
                headers = "Accept=*/*",
                produces = MediaType.APPLICATION_JSON_VALUE)

我仍然收到406错误。

2 个答案:

答案 0 :(得分:0)

超文本传输​​协议(HTTP) 406不可接受客户端错误响应代码表示服务器无法生成与请求的主动内容协商标头中定义的可接受值列表相匹配的响应,并且服务器不愿意提供默认表示。

积极的内容协商标头包括:

客户端(例如您的Web浏览器或我们的CheckUpDown机械手)可以向Web服务器(正在运行该网站)指示其将从Web服务器接收回的数据的特征。这是使用以下类型的“接受标头”完成的:

接受:客户端接受的MIME类型。例如,浏览器只能接受其知道如何处理的数据类型(HTML文件,GIF文件等)。

接受字符集:客户端接受的字符集。

接受编码:客户端接受的数据编码,例如它可以理解的文件格式。

接受语言:客户接受的自然语言(英语,德语等)。

接受范围:客户端是否接受来自资源(即资源的一部分)的字节范围。

通过在客户端更改或删除标头内容,它应该可以工作。

答案 1 :(得分:0)

当您指定headers = "Accept=application/json"时,就是说Accept标头必须存在并且具有正确的值。

客户端没有发送该值,也没有理由发送它,因为Accept标头值是逗号分隔的可接受值列表,因此它只需要列出application/json,则不必指定该值。

要解决此问题,请将headers = "Accept=application/json"替换为produces = "application/json"

当然,客户端仍然需要指定application/jsonapplication/**/*是可接受的。