Для чего нужен метод restTemplate.exchange()?

Собственно, что делает метод restTemplate.exchange()?

@RequestMapping(value = "/getphoto", method = RequestMethod.GET)
public void getPhoto(@RequestParam("id") Long id, HttpServletResponse response) {

    logger.debug("Retrieve photo with id: " + id);

    // Prepare acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.IMAGE_JPEG);

    // Prepare header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);
    HttpEntity<String> entity = new HttpEntity<String>(headers);

    // Send the request as GET
    ResponseEntity<byte[]> result = 
        restTemplate.exchange("http://localhost:7070/spring-rest-provider/krams/person/{id}", 
                              HttpMethod.GET, entity, byte[].class, id);

    // Display the image
    Writer.write(response, result.getBody());
}

Ответ 1

Документация по методу довольно проста:

Выполните метод HTTP для данного шаблона URI, записав данный объект запроса в запрос и вернув ответ как ResponseEntity.

Переменные шаблона URI раскрываются с использованием заданных переменных URI, если таковые имеются.


Рассмотрим следующий код, извлеченный из вашего собственного вопроса:

ResponseEntity<byte[]> result = 
    restTemplate.exchange("http://localhost:7070/spring-rest-provider/krams/person/{id}", 
                          HttpMethod.GET, entity, byte[].class, id);

У нас есть следующее:

  • GET запрос будет выполнен к указанному URL-адресу, отправив заголовки HTTP, заключенные в экземпляр HttpEntity.
  • Данный URL содержит переменную шаблона ({id}). Он будет заменен значением, указанным в последнем параметре метода (id).
  • ResponseEntity объект будет возвращен в виде byte[] заключенного в экземпляр ResponseEntity.

Ответ 2

Метод обмена выполняет метод HTTP против указанного шаблона URI, передавая параметры для замены. В этом случае он получает изображение для объекта пользователя для его параметра Id и возвращает для него массив байтов.

Ответ 3

Для более общего API обмена требуются параметр HttpMethod и объект запроса для полноты. Для сравнения:

ResponseEntity<Foo> response = 
restTemplate.exchange(url, HttpMethod.GET, request, Foo.class);

ResponseEntity<Foo> response = 
restTemplate.getForEntity(url, Foo.class);