java - ResponseEntityExceptionHandler 为 401 异常返回空响应正文
问题描述
我正在尝试使用 RestTemplate 实现对身份验证服务器的 Rest 调用并记录响应,以防服务器返回异常。为此,我使用了 ResponseEntityExceptionHandler 来处理 HttpClientErrorException 和 HttpServerErrorException。
public Response sendRequest(Request requestBody, String url, HttpMethod httpMethod, Response responseBody) {
RestTemplate restTemplate = new RestTemplate();
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(requestBody.getBody(),
this.securityHeaders);
ResponseEntity<? extends Response> response = restTemplate.exchange(url, httpMethod, request,
responseBody.getClass());
return response.getBody();
}
目前我的 ResponseEntityExceptionHandler 如下
@ControllerAdvice
public class RestResponseExceptionHandler extends ResponseEntityExceptionHandler {
private static Logger log = LoggerFactory.getLogger(RestResponseExceptionHandler.class);
private HttpHeaders headers = new HttpHeaders();
@ExceptionHandler(value = { HttpClientErrorException.class, HttpServerErrorException.class })
protected ResponseEntity<Object> handleConflict(HttpStatusCodeException ex, WebRequest request) {
ErrorMessage responseBody = new ErrorMessage();
try {
JSONObject bodyOfException = new JSONObject(ex.getResponseBodyAsString());
log.warn("{}| {}", ex.getStatusCode(), bodyOfException);
responseBody.setErrorAndDescription(bodyOfException.optString("error"),
bodyOfException.optString("error_description"));
} catch (JSONException e) {
log.error("{}| Bad authentication response body | Response Body | {}", ex.getStatusCode(),
ex.getResponseBodyAsString());
}
return handleExceptionInternal(ex, responseBody, headers, ex.getStatusCode(), request);
}
}
但是,仅对于 HttpStatus 401 异常,我得到一个空的响应正文。
日志示例:
400| {"error_description":"Bad client credentials","error":"invalid_client"}
401| Bad authentication response body | Response Body |
有谁知道我如何获得 401 异常的响应正文?
编辑:当使用邮递员调用身份验证服务器时,我得到非空 401 responseBody:
{
"error": "invalid_token",
"error_description": "Token was not recognised"
}
解决方案
我终于能够记录 401 异常的响应正文。我添加了依赖项
org.apache.httpcomponents:httpclient
并配置了 Rest Template Request Factory
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
显然,默认请求工厂 SimpleClientHttpRequestFactory 无法读取 401 Http Status 的响应正文。
推荐阅读
- typescript - 内置的 `Parameters` 辅助类型不适用于方法重载
- javascript - 如何使用 jQuery maphilight 更改单击图像和突出显示的区域
- r - 使用一组规则的多个列的差异
- react-native - 底部选项卡导航使屏幕透明,因此它显示最后一个屏幕 React Native
- javascript - 如何使用 JavaScript 从 HTML 选择标签中获取值或文本?
- reactjs - 使用 react-query 进行服务器端渲染,但 JSON 仍显示在网络选项卡中
- javascript - 如何返回响应正文 urllib 节点 js
- python - 在多级菜单中管理后退按钮 - Telegram Bot (Python)
- compiler-construction - 如何在 LLVM MachineFunctionPass 中创建函数并指定它们的顺序?
- go - 为什么不能将 int64 的最小值存储到 uint64 中?