如何在 Java 中解析响应正文,当 HTTP 请求具有返回状态 401 时
我正在使用Spring's和Jackson使用RESTful JSON API。在某些情况下,我们可能会收到一个(未经授权的)响应,其中包含由 API 制造商定义的自定义 JSON 正文,如下所示:RestTemplate
Status 401
{
"code": 123,
"message": "Reason for the error"
}
我们需要解析正文,并在业务逻辑中使用该属性。code
这是我们需要解析的 Java 对象的错误响应:
public class CustomError {
@JsonProperty
private Integer code;
@JsonProperty
private String message;
public Integer getCode() {
return code;
}
public String getMessage() {
return message;
}
}
以及一个自定义错误处理程序来执行此操作:
public class CustomErrorHandler extends DefaultResponseErrorHandler {
private RestTemplate restTemplate;
private ObjectMapper objectMapper;
private MappingJacksonHttpMessageConverter messageConverter;
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return super.hasError(response);
}
@Override
public void handleError(final ClientHttpResponse response) throws IOException {
try {
CustomError error =
(CustomError) messageConverter.read(CustomError.class, response);
throw new CustomErrorIOException(error, error.getMessage());
} catch (Exception e) {
// parsing failed, resort to default behavior
super.handleError(response);
}
}
}
错误处理程序失败,在 try 块中出现 :HttpMessageNotReadableException
“无法读取 JSON:在流模式下,由于服务器身份验证而无法重试”
这就是我发送请求的方式:
restTemplate.postForObject(url, pojoInstance, responseClass);
如果使用普通的旧 rest 客户端程序(如 Postman)执行相同的请求,则会收到预期的 JSON 响应。因此,我认为问题可能出在Spring的实现中,在401状态的情况下,它以某种方式不允许访问响应机构。ClientHttpResponse
是否确实可以解析响应正文?
更新
根据我的调查,该类使用它反过来创建一个提供输入流的。它就在那里,输入流被忽略并抛出:RestTemplate
ClientHttpResponse
sun.net.www.protocol.http.HttpURLConnection
IOException
在流式处理模式下,由于服务器身份验证而无法重试
因此,的实现导致了此问题。HttpURLConnection
是否有可能避免此问题?也许我们应该使用一种替代实现,在出现错误状态代码时不会忽略响应正文?您能推荐任何替代方案吗?