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