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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:16:05