RestTemplate 401 Unauthorized 오류 해결 (HttpComponentsClientHttpRequestFactory)
RestTemplate 를 사용해서 API 연동 중 API Server 또는 인증에 오류가 발생하면 HttpClientErrorException이 발생됩니다.
해당 오류가 발생되면 서버에서 발생된 HttpStatus, Body를 전달받지 못하고 401 오류가 발생되는데요.
API 서버에서 401 에러가 발생되었을 때 ResponseBody가 undefined 또는 "" 공백으로 리턴되는 오류가 발생했습니다.
이런 경우 해결할 수 있는 방법은 RestTemplate를 HttpComponentsClientHttpRequestFactory 인자로 생성하면 오류가 해결됩니다.
HttpComponentsClientHttpRequestFactory 를 사용하기 위해서는 의존성 추가를 해줘야 합니다.
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5'
restTemplate에 setRequestFactory new HttpComponentsClientHttpRequestFactory 를 추가하고 ErrorHandler를 추가합니다.
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
public boolean hasError(ClientHttpResponse response) throws IOException {
HttpStatus statusCode = response.getStatusCode();
return statusCode.series() == HttpStatus.Series.SERVER_ERROR;
}
});
HttpEntity<?> requestEntity = apiClientHttpEntity(param.toString());
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
public boolean hasError(ClientHttpResponse response) throws IOException {
HttpStatus statusCode = response.getStatusCode();
return statusCode.series() == HttpStatus.Series.SERVER_ERROR;
}
});
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
restTemplate.getMessageConverters().add(converter);
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JSONObject.class);