You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用Rest API报406错误及JSON节点解析失败求助

问题解决方法

1. 解决406 Not Acceptable报错

  • 补全Accept请求头:当前请求头没有指定接受的响应内容类型,RestTemplate序列化时会默认添加对应类型,和服务端返回的不匹配就会报406,添加以下代码即可:
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
// 若服务端返回hal格式的json,可改用下面的配置
// headers.setAccept(Collections.singletonList(MediaType.valueOf("application/hal+json")));
  • GET请求不要携带请求体:你当前构造HttpEntity时传入了new RetrieveAllAttributes()作为请求体,GET请求规范不建议携带body,改用Void类型的HttpEntity即可:
HttpEntity<Void> entity = new HttpEntity<>(headers);
  • 适配数组类型的响应:返回的JSON最外层是[]包裹的数组,不能直接用单个对象类接收,调用exchange时要改用数组类或者集合类型引用:
// 方案1:用数组接收
ResponseEntity<RetrieveAllAttributes[]> response = 
restTemplate.exchange(BASE_URL + attrPath + shortname + "&attributes=*", HttpMethod.GET, entity, RetrieveAllAttributes[].class);

// 方案2:用List接收
ParameterizedTypeReference<List<RetrieveAllAttributes>> typeRef = new ParameterizedTypeReference<List<RetrieveAllAttributes>>() {};
ResponseEntity<List<RetrieveAllAttributes>> response = restTemplate.exchange(url, HttpMethod.GET, entity, typeRef);

修改完成后就可以直接用自定义类接收响应,无需手动解析字符串。

2. 解决JsonNode解析找不到节点的问题

你当前的解析代码漏了两层结构:

  1. 最外层是JSON数组,需要先取数组的第一个元素
  2. self节点挂载在_links节点下,并非直接挂在根节点下

修改后的代码如下:

if(response.getStatusCode() == HttpStatus.OK){
    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.readTree(response.getBody());
    // 先取数组第一个元素,再取_links节点,最后读取self下的href
    JsonNode self_href = rootNode.get(0).path("_links").path("self").path("href");
    String hrefAsText = self_href.asText();
}

内容的提问来源于stack exchange,提问作者Anuska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:30:03