如何在Java中使用RestTemplate接收403 Forbidden的API响应内容
解决RestTemplate捕获403响应体的问题
RestTemplate默认会对非2xx状态码抛出异常,要获取403响应的响应体,有两种实用处理方式:
方法一:捕获异常手动解析响应体
针对4xx错误,RestTemplate会抛出HttpClientErrorException,我们可以捕获该异常,从中提取响应体并反序列化为ApiResponse对象。
修改后的代码如下:
public ApiResponse callApi(String url, ApiRequest request) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<ApiRequest> httpRequest = new HttpEntity<>(request, headers); RestTemplate restTemplate = new RestTemplate(); try { ResponseEntity<ApiResponse> responseEntity = restTemplate.postForEntity(url, httpRequest, ApiResponse.class); return responseEntity.getBody(); } catch (HttpClientErrorException e) { if (e.getStatusCode() == HttpStatus.FORBIDDEN) { ObjectMapper objectMapper = new ObjectMapper(); try { // 将异常中的响应体转换为ApiResponse return objectMapper.readValue(e.getResponseBodyAsString(), ApiResponse.class); } catch (JsonProcessingException ex) { // 解析失败时的兜底处理 ex.printStackTrace(); return new ApiResponse(false, "解析错误响应失败", "PARSE_ERROR"); } } // 其他4xx错误可按需处理,此处直接抛出 throw e; } }
方法二:自定义ResponseErrorHandler(全局统一处理)
如果需要让所有RestTemplate请求都统一处理错误响应,可以自定义错误处理器,避免403时抛出异常,直接解析响应体。
1. 实现自定义错误处理器
public class CustomResponseErrorHandler extends DefaultResponseErrorHandler { private ObjectMapper objectMapper = new ObjectMapper(); @Override public void handleError(ClientHttpResponse response) throws IOException { HttpStatus statusCode = response.getStatusCode(); // 仅对403错误不抛出异常,其他错误沿用默认逻辑 if (statusCode == HttpStatus.FORBIDDEN) { return; } super.handleError(response); } @Override public boolean hasError(ClientHttpResponse response) throws IOException { // 保持默认错误判断逻辑:非2xx状态码视为错误 return super.hasError(response); } }
2. 配置RestTemplate使用自定义处理器
改用exchange方法(比postForEntity更灵活),设置自定义错误处理器后,无论200还是403都能直接获取解析后的响应体:
public ApiResponse callApi(String url, ApiRequest request) { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<ApiRequest> httpRequest = new HttpEntity<>(request, headers); RestTemplate restTemplate = new RestTemplate(); restTemplate.setErrorHandler(new CustomResponseErrorHandler()); ResponseEntity<ApiResponse> responseEntity = restTemplate.exchange( url, HttpMethod.POST, httpRequest, ApiResponse.class ); return responseEntity.getBody(); }
注:你的ApiResponse实体已包含403响应中的status、message、errorcode字段,反序列化时会自动匹配,响应中的data字段因实体未定义会被忽略,不影响解析。
内容的提问来源于stack exchange,提问作者abhishek
相关产品推荐
相关产品推荐

