Главная » Spring » Клиенты REST Spring

0

Обычно в нашем представлении веб-приложения ассоциируются с пользовательским интерфейсом в веб-браузере. Но к веб-прило-

жениям, реализующим работу с ресурсами в стиле RESTful, это не относится. Сам факт передачи данных через Всемирную паутину еще не означает, что эти данные обязательно должны отображаться в окне веб-браузера. Более того, можно даже написать веб-при- ложение, взаимодействующее с другим веб-приложением посред- ством RESTful API.

Разработка программ, взаимодействующих с ресурсами в стиле RESTful, может оказаться весьма утомительным занятием, требую- щим писать массу шаблонного кода. Например, допустим, что по- требовалось написать некоторый клиентский программный код, который пользовался бы прикладным интерфейсом извлечения со- общений определенного пользователя, разработанным выше в этой главе. В листинге 12.5 представлено одно из возможных решений этой задачи.

Листинг 12.5. При создании клиента в архитектуре REST придется написать массу шаблонного кода и предусмотреть обработку исключений

public  Spittle[]  retrieveSpittlesForSpitter(String  username)  { try  {

HttpClient   httpClient   =   new   DefaultHttpClient();

String    spittleUrl    =    "http://localhost:8080/Spitter/spitters/"    +

username + "/spittles";    // Подготовить URL HttpGet  getRequest  =  new  HttpGet(spittleUrl);            // Создать  запрос

getRequest.setHeader(

new    BasicHeader("Accept",    "application/json"));

HttpResponse response = httpClient.execute(getRequest); // Выполнить HttpEntity  entity  =  response.getEntity();             // Извлечь  результаты

ObjectMapper   mapper   =   new   ObjectMapper();

return mapper.readValue(entity.getContent(), Spittle[].class);

} catch (IOException e) {

throw  new  SpitterClientException("Unable  to  retrieve  Spittles",  e);

}

}

Как видите, чтобы получить ресурс REST, необходимо немало потрудиться. И это при том, что я немного сжульничал, воспользо-

вавшись библиотекой Jakarta Commons HTTP Client1, чтобы создать запрос, и библиотекой Jackson JSON Processor2 для преобразования ответа.

Взглянув поближе на метод retrieveSpittlesForSpitter(), можно за-

метить, что здесь не так много программного кода связано с реализа- цией конкретной функциональностью. Если теперь написать другой метод, извлекающий другой ресурс REST, обнаружится, что эти два метода имеют совсем немного отличий.

Более того, метод выполняет множество операций, каждая из кото- рых может возбудить исключение IOException. Поскольку IOException является контролируемым исключением, я вынужден предусмот- реть либо его обработку, либо повторное его возбуждение. В данном случае я предпочел перехватить исключение и взамен возбудить не- контролируемое  исключение  SpitterClientException.

С таким количеством шаблонного кода, связанного с извлечени- ем ресурса, было бы неплохо иметь возможность инкапсулировать его и обеспечить различные варианты выполнения с помощью па- раметров. Именно эту цель преследует класс RestTemplate, входящий в состав фреймворка Spring. Подобно тому, как JdbcTemplate прячет неудобства работы с данными при помощи JDBC, RestTemplate осво- бождает программиста от реализации рутинных операций при рабо- те с ресурсами RESTful.

Чуть ниже будет показано, как можно переписать метод retrieve- SpittlesForSpitter() и с помощью RestTemplate существенно умень- шить объем шаблонного кода. Но сначала познакомимся со всеми REST-операциями, которые может предложить класс RestTemplate.

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

По теме:

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