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를 추가합니다.

  1. restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
  2. restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
  3. public boolean hasError(ClientHttpResponse response) throws IOException {
  4. HttpStatus statusCode = response.getStatusCode();
  5. return statusCode.series() == HttpStatus.Series.SERVER_ERROR;
  6. }
  7. });
  1. HttpEntity<?> requestEntity = apiClientHttpEntity(param.toString());
  2. RestTemplate restTemplate = new RestTemplate();
  3. restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
  4. restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
  5. public boolean hasError(ClientHttpResponse response) throws IOException {
  6. HttpStatus statusCode = response.getStatusCode();
  7. return statusCode.series() == HttpStatus.Series.SERVER_ERROR;
  8. }
  9. });
  10. MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
  11. restTemplate.getMessageConverters().add(converter);
  12. ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(URL, HttpMethod.POST, requestEntity, JSONObject.class);
* 파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
작성자 소개
초이 프로필
WrapUp 블로거

초이

반려견을 좋아하고, 차를 좋아하고, 여행을 좋아하고, 맛집을 찾아 즐기는 웹 개발자 입니다^^