사용자 도구

사이트 도구


springframework:resttemplate

Spring RestTemplate

HttpEntity

POST에서 파라미터 보내기

  • java - Spring RestTemplate postForObject with Header: webservice can't find my header parameters
    MultiValueMap<String, String> parameters = new LinkedMultiValueMap<String, String>();
    parameters.add("companyId", companyId);
    parameters.add("password", password);  
     
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);      
     
    HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(parameters, headers);
     
    // 메시지 컨버터 지정 안했으면
    // List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    // messageConverters.add(new MappingJacksonHttpMessageConverter());    
    // messageConverters.add(new FormHttpMessageConverter());
    // restTemplate.setMessageConverters(messageConverters);
     
    LoginResponse response = (LoginResponse) restTemplate.postForObject(url, request, LoginResponse.class); 
     
    // ParemeterizedTypeReference를 사용하여 복잡한 Generic Type 으로 요청 결과 받기
    public ParameterizedTypeReference<Map<Long, LoginUser>> loginUserMapType =
        new ParameterizedTypeReference<Map<Long, LoginUser>>() { };
     
    restTemplate.exchange(url, HttpMethod.POST, request, loginUserMapType).getBody();

Exception 처리

public class MyErrorHandler implements ResponseErrorHandler {
  @Override
  public void handleError(ClientHttpResponse response) throws IOException {
    // your error handling here
  }
 
  @Override
  public boolean hasError(ClientHttpResponse response) throws IOException {
    // ...
  }
}
 
// [...]
 
public static void main(String args[]) {
  RestTemplate restTemplate = new RestTemplate();
  restTemplate.setErrorHandler(new MyErrorHandler());
}

Interceptor를 통한 로깅

  • Spring RestTemplate 에서 로그 처리
    // ClientHttpRequestInterceptor 인터페이스를 로깅을 남기게 구현해서 넣어주면 된다.
     
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory())); // body 스트림을 소모해버리지 않게 복제
    restTemplate.setInterceptors(Lists.newArrayList(new RestTemplateLoggingInterceptor())); // RestTemplateLoggingInterceptor는 로그를 남기는 구현. body를 읽어버림.

SpringBoot

  • org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
  • RestTemplateBuilder 가 존재하지 않을 경우 생성해준다.
  • RestTemplate 자체는 생성해주지 않고 Builder 만 만들어준다.
  • RestTemplateCustomizer, RestTemplateRequestCustomizer Bean 들을 통해 조정해준다.
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    return restTemplateBuilder
            .requestFactory(() -> new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()))
            .setConnectTimeout(Duration.ofMillis(5000)) // connection-timeout
            .setReadTimeout(Duration.ofMillis(5000)) // read-timeout
            .additionalMessageConverters(new StringHttpMessageConverter(Charset.forName("UTF-8")))
            .build();
}

참조

springframework/resttemplate.txt · 마지막으로 수정됨: 2022/01/14 15:43 저자 kwon37xi