Шаблон Команды Удаленного Вызова Процедур (Rpc) Android



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

Сначала была надежда, что платформа позволит использовать технологию EJB. После недолгих поисков в Интернете я убедился, что не все так просто.

Большинство источников рекомендовали использовать веб-сервисы в качестве альтернативы, потому что.

EJB слишком тяжел для Android. Для веб-сервисов был рекомендован фреймворк ksoap2-android .

Наткнувшись на различные грабли во время первоначального изучения ksoap2, я дошёл до того этапа, когда мне нужно было отправлять и получать с сервера объект моего кастомного типа.

Я воспользовался поиском и нашел это Эта статья .

Отсюда я узнал, что каждый пользовательский объект должен реализовывать интерфейс.

KvmСериализуемый .

Это также означало, что мы должны реализовать методы сериализации и десериализации объекта.

Поскольку по идее предполагалось использовать более сотни собственных объектов, идея написать реализацию KvmSerializable для каждого из них как-то не вызвала у меня энтузиазма.

Что делать? Неужели за столько лет на платформе Android нет более удобного способа организовать RPC? Поиски продолжались.

Многие источники рекомендуют использовать JSON. Но писать сериализацию для JSON мне тоже не особо хотелось.

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

Последняя надежда была на технологию GWT-RPC. Предполагалось, что, поскольку GWT и Android являются одной и той же корпорацией, вероятно, должен существовать простой способ вызова методов GWT-RPC из клиента Android. К сожалению, я не нашел такого метода.

Хоть и существует библиотека gwt-phonegap, мне почему-то не удалось найти никакой информации касательно RPC. Практически полностью разочаровавшись в результатах своих поисков, я хотел махнуть рукой на это дело.

Но потом я нашел это интересная статья .

Автор предложил использовать бинарную сериализацию, т.е.

стандартную для платформы Java, и отправлять объекты с помощью протокола HTTP и встроенного в Android HTTP-клиента Apache. Правда, оговаривалось, что подход может работать не для всех объектов.

Но среди преимуществ было заявлено, что это действительно экономит время разработки.

Я немного протестировал идею автора и убедился, что для многих объектов такой тип сериализации и транспорта более чем подходит. Конечно, многие разработчики называют метод бинарной сериализации для Android злом, потому что.

Трудно гарантировать, что на сервере и клиенте будут одинаковые версии классов.

В принципе, я не собирался ничего писать для широкой публики, поэтому для себя не увидел ничего плохого в таком подходе.

Я просто сделал пометку, что тестировать эту штуку нужно для каждого нового, более-менее сложного объекта.

Похоже, с транспортировкой и сериализацией я более-менее определился.

Теперь мне хотелось иметь какой-нибудь удобный инструмент для использования в приложении.

Тут мне пришлось снова вспомнить про GWT, а именно про чудесный фреймворк gwt-отправка , с чем мне уже приходилось иметь дело.

Уже был на хабе хорошая статья о нем.

Gwt-dispatch — это проект с открытым исходным кодом, который по сути построен на основе GWT RemoteServiceServlet. Проанализировав вышеизложенную информацию, мне показалось, что можно и не очень сложно переделать этот фреймворк в обертку над обычным сервлетом.

А на стороне Android вызовите необходимые методы с помощью http-клиента.

Я начал изучать исходный код проекта.

Пришлось упростить серверную часть и разорвать всякую связь с GWT. Теперь все объекты Действие надо было реализовать обычный интерфейс Сериализуемый вместо ГВТ IsSerializable .

После нескольких дней работы на выходе появился результат, которым я хотел поделиться с сообществом.

Поэтому я поместил его в библиотеку под названием http-отправка .

По своей сути это слегка модифицированный фреймворк gwt-dispatch. Но самое приятное то, что библиотека готова к тестированию и, надеюсь, к использованию на платформе Android. По крайней мере первые тесты в эмуляторе и на моем планшете прошли успешно.

Надеюсь, что с помощью сообщества результат будет реализован.

На этом предисловие заканчивается.

Я имею в виду, что многие читатели все же пришли сюда за практической частью.



Практическая часть

Шаблон команды подразумевает, что клиент отправляет серверу определенную команду заранее определенного типа.

Сервер распознает его и выполняет связанное с ним действие, используя команду в качестве аргумента.

После выполнения действия клиенту возвращается определенный результат. Я покажу вам, как написать простую команду ping, используя платформу http-dispatch. Команда отправит произвольный объект на сервер и получит тот же объект обратно.



Общая клиент-серверная часть

Прежде всего опишем объекты, необходимые для работы как клиента, так и сервера.

Во-первых, результат команды.

Каждый результат должен реализовывать интерфейс net.customware.http.dispatch.shared.Result .

Наш результат расширит абстрактный класс АннотацияПростойРезультат , который подходит для ситуаций, когда с сервера возвращается один объект. PingActionResult.java

   

import net.customware.http.dispatch.shared.AbstractSimpleResult; public class PingActionResult extends AbstractSimpleResult<Object> {

Теги: #Android #rpc #Шаблон команды #Dispatch #java #guice #java #Разработка Android
Вместе с данным постом часто просматривают: