Главная » Spring » Создание новых ресурсов Spring

0

Взглянув еще раз на табл. 12.3, можно заметить, что класс RestTemplate включает три разных метода для выполнения POST- запросов. Если умножить это число на три (по количеству версий каждого метода), получится девять методов, посылающих данные на сервер методом POST.

Имена двух из этих методов покажутся вам знакомыми. Мето- ды postForObject() и postForEntity() выполняют POST-запросы почти так же, как методы getForObject() и getForEntity() выполняют GET- запросы. Другой метод, getForLocation(), является уникальным в этом отношении.

Прием объектов в ответах на POST-запросы

Представим,  что  нам  необходимо  воспользоваться  классом

RestTemplate, чтобы отправить на сервер новый объект Spitter. По-

скольку это совершенно новый объект Spitter, он пока не известен серверу. Поэтому официально он не является ресурсом REST и не имеет собственного URL. Кроме того, идентификатор его не будет известен клиенту, пока он не будет создан на сервере.

Один из способов отправить новый ресурс на сервер заключает- ся в использовании метода postForObject() класса RestTemplate. Метод postForObject() имеет три версии со следующими сигнатурами:

<T>  T  postForObject(URI  url,  Object  request,  Class<T>  responseType) throws    RestClientException;

<T> T postForObject(String url, Object request, Class<T> responseType, Object…   uriVariables)   throws   RestClientException;

<T>  T  postForObject(String  url,  Object  request,  Class<T>  responseType, Map<String,   ?>   uriVariables)   throws   RestClientException;

Во всех версиях в первом параметре передается адрес URL, куда должен быть отправлен ресурс, во втором параметре – отправляе- мый объект, в третьем – Java-тип объекта, который, как ожидается, должен быть возвращен обратно. В версиях, которые принимают URL в виде строки, четвертый параметр определяет значения пере- менных-заполнителей в шаблоне URL (либо в виде списка аргумен- тов переменной длины, либо в виде отображения Map).

В приложении Spitter новые ресурсы Spitter должны отправлять- ся по адресу http://localhost:8080/Spitter/spitters, где находится метод-обработчик, сохраняющий объекты. Поскольку этот URL не содержит переменных, можно использовать любую версию метода postForObject(). Но в интересах простоты и чтобы избежать необхо- димости перехватывать исключения, которые могут возбуждаться при конструировании нового объекта URI, мы реализуем эту опера- цию, как показано ниже:

public   Spitter   postSpitterForObject(Spitter   spitter)   { RestTemplate rest = new RestTemplate();

return   rest.postForObject("http://localhost:8080/Spitter/spitters", spitter,  Spitter.class);

}

Метод postSpitterForObject() получает новый объект Spitter и с по- мощью postForObject() отправляет его на сервер. В ответ он получает объект Spitter и возвращает его вызывающей программе.

Как и при использовании метода getForObject(), может возник- нуть потребность исследовать некоторые метаданные, поступающие вместе с ответом. В этом случае предпочтительнее будет использо- вать метод postForEntity(). Метод postForEntity() имеет три версии, сигнатуры которых являются почти точным отражением сигнатур версий метода postForObject():

<T>  ResponseEntity<T>  postForEntity(URI  url,  Object  request, Class<T>  responseType)  throws  RestClientException;

<T> ResponseEntity<T> postForEntity(String url, Object request, Class<T>  responseType,  Object…  uriVariables)

throws RestClientException;

<T>  ResponseEntity<T>  postForEntity(String  url,  Object  request, Class<T>  responseType,  Map<String,  ?>  uriVariables) throws    RestClientException;

Предположим, что помимо возвращаемого обратно ресурса Spitter необходимо также извлечь из ответа значение заголовка Location. В этом случае можно воспользоваться методом postForEntity(), как показано ниже:

RestTemplate  rest  =  new  RestTemplate(); ResponseEntity<Spitter>   response   =   rest.postForEntity(

"http://localhost:8080/Spitter/spitters", spitter, Spitter.class);

Spitter  spitter  =  response.getBody();

URI   url   =   response.getHeaders().getLocation();

Подобно методу getForEntity(), метод postForEntity() возвращает объект ResponseEntity<T>. Извлечь ресурс (в данном случае – объект Spitter) из этого объекта можно с помощью его метода getBody(). А с помощью метода getHeaders() можно извлечь объект HttpHeaders и уже с его помощью получить доступ к различным HTTP-заголовкам ответа. В примере выше значение заголовка Location извлекается вы- зовом метода getLocation(), который возвращает его в виде объекта java.net.URI.

Прием местоположения ресурса после выполнения  POST-запроса

Метод postForEntity() удобно использовать для приема отправ- ленного ресурса и заголовков ответа. Но часто бывает так, что нет

необходимости принимать отправленный ресурс обратно (в конце концов, этот ресурс уже имеется в приложении). Если значение за- головка Location – это все, что представляет интерес, тогда проще будет воспользоваться методом postForLocation()  класса RestTemplate.

Подобно другим методам, выполняющим POST-запросы, метод postForLocation() отправляет ресурс на сервер в теле POST-запроса. Но вместо объекта ресурса метод postForLocation() возвращает местопо- ложение вновь созданного ресурса. Три версии этого метода имеют следующие сигнатуры:

URI  postForLocation(String url,  Object request, Object…  uriVariables) throws RestClientException;

URI   postForLocation(

String  url,  Object  request,  Map<String,  ?>  uriVariables) throws RestClientException;

URI postForLocation(URI url, Object request) throws RestClientException;

Для демонстрации метода postForLocation() попробуем реализо- вать отправку объекта Spitter еще раз. На этот раз потребуем вер- нуть URL ресурса:

public   String   postSpitter(Spitter   spitter)   { RestTemplate rest = new RestTemplate();

return   rest.postForLocation("http://localhost:8080/Spitter/spitters",

spitter).toString();

}

Здесь адрес URL передается в виде строки (в данном случае шаб- лон URL не содержит переменных-заполнителей). Если после соз- дания ресурса сервер вернет его URL в заголовке Location ответа, то метод postForLocation() вернет этот URL в виде строки.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии