Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
16
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

6.3.4 Клиент, реализующий методы GET и POST

Решение конкретных задач потребителей сервиса выполним посредством последовательной реализации методов запроса, обозначенных в шаблоне компоненты-подложки Lab9. Данному пункту учебного материала соответствуют методы mGetList(), mGetLetter() и mPostLetter() листинга 6.15.

Начнем последовательную реализацию рассматриваемой компоненты Lab9 с метода mGetList(), который должен:

1)проверить авторизацию пользователя и правильный выбор выполняемой работы, для чего следует воспользоваться методом isAuth(); если авторизация не проходит, то выставить в приватную переменную соответствующее сообщение и вернуться назад к ресурсу lab9.xhtml; если авторизация выполнена правильно, то выполнить следующие пункты;

2)сформировать и отправить запрос к производителю сервиса по указанному в переменной address значению адреса;

3)получить ответ в виде объекта типа Response, извлечь из него код ответа и поместить этот код в переменную resMsg; если код ответа не равен 200, то вернуться назад к ресурсу lab9.xhtml;

4)извлечь из Response объект типа ListLets;

5)извлечь из ListLets объект типа List<Letter> и присвоить его приватной переменной list;

6)вернуться к ресурсу lab9.xhtml.

Описанная выше реализация метода mGetList() показана на листинге 6.17.

Листинг 6.17 — Реализация метода mGetList() компоненты Lab9

//Получить список объектов типа Letter public String mGetList()

{

// Проверяем авторизацию if(!isAuth()) {

resMsg = "Метод GET - нет авторизации!"; return "lab9";

}

// Формируем запрос к сервису

WebTarget target = ClientBuilder.newClient()

.target(this.address); Invocation invocation =

target.request(MediaType.TEXT_PLAIN_TYPE)

.buildGet();

//Отправка запроса и получение ответа Response response =

invocation.invoke();

//Проверка кода возврата

283

int status = response.getStatus(); if(status != 200) {

resMsg = "Метод GET - код возврата: "

+ new Integer(status).toString() + "!"; return "lab9";

}

resMsg = "Метод GET - код возврата: 200 - Хорошо";

//Извлечение тела ответа в виде объекта типа ListLets ListLets body =

response.readEntity(ListLets.class);

//Извлекаем список записей и возвращаемся к lab9.xhtml list = body.getList();

return "lab9";

}

После реализации метода mGetList(), активация кнопки «GET-список» будет приводить к чтению всего списка записей и отображения его в окне ресурса, как это показано на рисунке 6.15.

Рисунок 6.15 — Результат работы метода mGetList()

Теперь перейдем к реализации метода mGetLetter(), который отличается от предыдущего метода следующими моментами:

284

а) при формировании адреса запроса, кроме переменной address используется также переменная id;

б) если код возврата равен 204, то — адресуемый объект в ответе отсутсвует; в) из объекта типа Response извлекается объект типа Letter;

г) из объекта типа Letter извлекаются и устанавливаются переменные id и text.

Описанная реализация метода mGetLetter() показана на листинге 6.18.

Листинг 6.18 — Реализация метода mGetLetter() компоненты Lab9

// Получить объект типа Letter по идентификатору id public String mGetLetter() {

//Проверяем авторизацию if(!isAuth()) {

resMsg = "Метод GET - нет авторизации!"; return "lab9";

}

//Формируем запрос к сервису

WebTarget target = ClientBuilder.newClient()

.target(this.address)

.path(new Integer(id).toString()); Invocation invocation =

target.request(MediaType.TEXT_PLAIN_TYPE)

.buildGet();

//Отправка запроса и получение ответа Response response =

invocation.invoke();

//Проверка кода возврата

int status = response.getStatus(); if(status == 204) {

resMsg = "Метод GET - код возврата: "

+new Integer(status).toString()

+" - Отсутствует объект запроса с id="

+new Integer(id).toString();

return "lab9";

}

if(status != 200) {

resMsg = "Метод GET - код возврата: "

+ new Integer(status).toString() + "!"; return "lab9";

}

resMsg = "Метод GET - код возврата: 200 - Хорошо";

//Извлечение тела ответа в виде объекта типа ListLets Letter body =

response.readEntity(Letter.class);

//Извлекаем id, text и возвращаемся к lab9.xhtml

id = body.getId(); text = body.getText(); return "lab9";

285

}

После реализации метода mGetLetter(), активация кнопки «GET-письмо» будет приводить к чтению отдельной записи и отображения ее в окне ресурса, как это показано на рисунке 6.16.

Рисунок 6.16 — Результат работы метода mGetLetter()

Теперь перейдем к следующей задаче. Она предполагает реализовать в компоненте-подложке Lab9 метод mPostLetter(). Для этого, должен быть создан объект типа Letter, включающий:

а) заданное значение переменной text; б) сгенерированное значение типа Date;

в) прочитанное из компоненты RSOS имя пользователя name.

Обратите внимание, что переменная id не используется, поскольку она будет присвоена самой СУБД.

В самом запросе передается объект типа Letter, а в ответе объекта типа Response возможны две ситуации:

1) код статуса 201 - Создано с URI нового ресурса;

286

2) код статуса 204 — Нет содержимого, если метод не создал ресурс.

Описанная выше реализация метода mPostLetter() представлена на листинге 6.19.

Листинг 6.19 — Реализация метода mPostLetter() компоненты Lab9

// Создать новый объект типа Letter public String mPostLetter() {

// Проверяем авторизацию if(!isAuth()) {

resMsg = "Метод POST - нет авторизации!"; return "lab9";

}

//Создаем новый объект типа Letter Letter letter =

new Letter(new Date(), rsos.getUser(), text);

//Формируем запрос к сервису

WebTarget target = ClientBuilder.newClient()

.target(this.address)

.register(Letter.class); Invocation invocation =

target.request(MediaType.APPLICATION_XHTML_XML)

.buildPost(Entity.entity(letter, MediaType.APPLICATION_XML_TYPE));

//Отправка запроса и получение ответа Response response =

invocation.invoke();

//Проверка кода возврата

int status = response.getStatus(); if(status == 204) {

resMsg = "Метод POST - код возврата: "

+new Integer(status).toString()

+" - Нет содержимого";

return "lab9";

}

if(status != 201) {

resMsg = "Метод POST - код возврата: "

+ new Integer(status).toString() + "!"; return "lab9";

}

//Извлечение адреса созданного объекта resMsg = "Метод POST - адрес сообщения: "

+response.getLocation();

//Возвращаемся к lab9.xhtml

return "lab9";

}

После реализации метода mPostLetter(), активация кнопки «POST-новое» будет приводить к созданию новой отдельной записи и отображению ее адреса в окне ресурса, как это показано на рисунке 6.17.

287