Работа с Сервером
May 26, 2020 · View on GitHub
Работа с Сервером
Работа с сервером обычно происходит с помощью библиотек retrofit2, okhttp, gson, rxjava.
Для работы с сетью предусмотрены модули:
При работе с сервером возникает необхдимость добавлять те или иные параметры
в запрос. Для этих целей хорошо подходит сущности типа Interceptor. Такие
сущности передаются в билдер OkHttp-клента.
Также удобно логгировать ответы сервера, а также ошибки парсинга на удаленный сервер с целью быстрого нахождения ошибок. Не следует логгировать пользовательские данные.
Обработка ошибок
Обработка большинства ошибок происходит на уровне Presenter'а.
Если на сервере существует механизм ошибок, когда не с 200-м кодом
приходит еще и тело ошибки, то такие сообщения следует приводить к специфичному
исключению. Эти операции следует производить на уровне CallAdapter'а
Ошибки парсинга Json (JsonSyntaxException) следует конвертировать в некоторую
кастомную ошибку. Этим занимается Converter.
Открытие экранов по спец ошибкам
В случае если возникает необходимость открыть экран прямо из слоя Interactor, например, когда у пользователя устарел токен и необходимо перекинуть его на экран авторизации, необходимо использовать глобальный навигатор, поставляемый модулем core-ui. Это необходимо, чтобы не тащить данную логику на ui.
Маппинг ответов сервера
Хорошей практикой является абстрагирование доменного слоя на клиенте от серверной модели данных (доменной модели). Примеры:
-
сервер(плохой) на несколько запросов отдает информацию о пользователе, но в разных форматах.
-
на сервере структура объектов усложнена, присутствует большая вложенность.
-
маппинг вложенных объектов, типов, например
String->Enum. -
у доменной сущности есть дополнительные поля, которых нет на сервере, тогда нам необходимо их проинициализировать при маппинге. Здесь как раз играет роль то, что доменная область описывает нужды приложения. Допустим есть сущность в виде медиа-элемента, который мы можем загрузить с устройства. В домменой области, он может иметь доп.поля, например состояние загруженности. Этих полей не будет в серверном слое.
В целом, маппинг необходим для разделения ответственности. Одни модели предназначены для парсинга, другие - доменные - для внутреннего использования.
Доменная область на клиенте(в приложении) должна отвечать в первую очередь бизнес-логике приложения.
Исходя из этих соображений, возникает необходимость преобразовывать ответы сервера в модели на клиенте.
В наших приложениях приняты следующие договоренности - классы, которые используются:
-
для парсинга ответа должны быть с суффиксом
Response -
для формирования запроса должны быть с суффиксом
Request -
для парсинга вложенных Json объектов должны быть с суффиксом
Obj
Маппинг серверных ответов происходит в репозитории Repository с помощью
специальных методов, утилит или
операторов(так как используем Rx).
Тесты API
todo Следует покрывать тестами все методы сервера, чтобы понимать состояние сервера.