Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
AlexanderX
2 / 2 / 1
Регистрация: 08.10.2015
Сообщений: 14
Завершенные тесты: 1
#1

Retrofit 2 эффективная обработка разных ответов - Программирование Android

06.12.2016, 11:24. Просмотров 484. Ответов 4

Осваиваю Retrofit, и столкнулся с проблемой, решение которой не могу нигде найти. Вроде все просто. Есть REST сервер, который по разным запросам выдает разные JSON объекты. Например: по команде getuser, возвращает информацию о пользователе. По команде gettopic, возвращает информацию о теме форума. По команде getmessage - информацию о сообщении и т.д. Я создал отдельные POJO классы для ответов, но получается, что при каждом обращении на сервер за ответом приходится писать повторяющийся код. Отличие описанного ниже метода для разных запросов только в классах запроса и ответа, и в методе, вызываемом в слушателе. Есть ли какие-то наработки в плане обработки разных ответов от одного сервера? В интернете везде объясняется только как получить один ответ.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public void getUser (final ApiResponseListener apiResponseListener, id user){
        ApiServer apiServer = getApiServer();
 
        UserRequestModel userRequestModel = new UserRequestModel(id);
 
        Call<UserResponseModel> call = apiServer.getUser(userRequestModel);
        call.enqueue(new Callback<UserResponseModel>() {
 
            @Override
            public void onResponse(Call<UserResponseModel> call, Response<UserResponseModel> response) {
                if (response.isSuccessful()) {
                    UserResponseModel userResponseModel = response.body();
                    apiResponseListener.onGetUser(userResponseModel.getResponse().getEmail());
 
                } else {
                    //...
                }
            }
 
            @Override
            public void onFailure(Call<UserResponseModel> call, Throwable throwable) {
                    //...
           }
        });
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2016, 11:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Retrofit 2 эффективная обработка разных ответов (Программирование Android):

Retrofit Recyclerview - Программирование Android
Здравствуйте, уважаемые форумчане. Помогите добавить onScroll в RecyclerView. Вот код public class MainActivity extends...

Библиотека Retrofit - Программирование Android
Мне нужно освоить библиотеку Retrofit.Я нашол урок https://www.youtube.com/watch?v=c5HX_GoyaDs. Я постарался повторить и у меня возникли...

OPTIONS запросы в Retrofit - Программирование Android
Всем привет, никто не сталкивался с данным вопросом? Я нашел в репозитории ретрофита какое-то упоминание но я не знаю как его примернить...

Retrofit, JSON, @POST, @GET - Программирование Android
Уважаемые программисты, прошу вашей помощи! Хожу на курсы по разработке мобильных приложений, месяц, как хожу, мало еще что знаю, но...

Прокладывание маршрута и Retrofit - Программирование Android
Добрый день. Есть проблема с реализацией маршрутов в приложении. Суть проста: есть 2 точки, необходимо их соединить маршрутом. На основе...

Retrofit 2 post запрос - Программирование Android
Делал реализацию клиент-сервер, в андроид при помощи retrofit. и встретился с проблемой как реализовать POST запрос. ( GET запрос у меня...

4
Mikalai
260 / 236 / 95
Регистрация: 11.01.2015
Сообщений: 663
06.12.2016, 11:54 #2
Как вариант: создай один класс-модель ответа сервера в котором размести поля всех возможных ответов. Когда получишь ответ сервера реагируй в зависимости от заполненных полей.
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
06.12.2016, 20:37 #3
AlexanderX, тоже решил с ним работать. Чуть видоизменил код, у меня не два события, а три: onSuccess, onError, onFailure (первые два вытекают из onResponse). Также прописал вывод в лог текущего запроса (в первых двух событиях). Поскольку при ошибке сервер может выдавать другую модель, приходится иногда прописывать класс и для ошибки.
Завёл класс с запросами (название API-метода, параметры), класс с обработчиками запросов. Особых упрощений пока не получил, но стремлюсь к единообразию.
1
AlexanderX
2 / 2 / 1
Регистрация: 08.10.2015
Сообщений: 14
Завершенные тесты: 1
07.12.2016, 09:07  [ТС] #4
CoolMind, спасибо за идею разделения onResponse. А как реализовал классы запросов и ответов? Как Mikalai? У меня папка с моделями, и для каждого запроса и ответа отдельные классы.

Добавлено через 2 часа 54 минуты
С помощью generic собрал себе вот такой велосипед
Java
1
2
3
4
5
6
7
8
9
10
11
12
public static final int USER_REQUEST = 0;
public static final int TOPIC_REQUEST = 1;
public static final int MESSAGE_REQUEST = 2;
 
public void getUser(final ApiResponseListener apiResponseListener, int id){
        ApiServer apiServer = getApiServer();
 
        UserRequestModel userRequestModel = new UserRequestModel(id);
 
        Call<UserResponseModel> call = apiServer.getUser(userRequestModel);
        call.enqueue(new RetrofitCallback<UserResponseModel>(USER_REQUEST, apiResponseListener));        
    }
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class RetrofitCallback<T> implements Callback<T>{
        ApiResponseListener mApiResponseListener;
        int mRequestType;
 
        public RetrofitCallback(int requestType, ApiResponseListener apiResponseListener) {
            mApiResponseListener = apiResponseListener;
        }
 
        @Override
        public void onResponse(Call<T> call, Response<T> response) {
            if (response.isSuccessful()) onSuccess(call,response);
            else onError(call, response);
        }
 
        public void onSuccess(Call<T> call, Response<T> response){
            T responseModel = response.body();
            switch (mRequestType){
                case USER_REQUEST:{
                    UserResponseModel userResponseModel = (UserResponseModel)responseModel;
                    mApiResponseListener.onGetUser(userResponseModel.getResponse().getEmail());
                    break;
                }
                case TOPIC_REQUEST:{
                    TopicResponseModel topicResponseModel = (TopicResponseModel)responseModel;
                    mApiResponseListener.onGetTopic(topicResponseModel.getResponse().getLabel());
                    break;
                }
                //...
            }
        }
 
        public void onError(Call<T> call, Response<T> response){
            //...
        }
 
        @Override
        public void onFailure(Call<T> call, Throwable throwable) {
            //..
        }
    }
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
08.12.2016, 13:01 #5
AlexanderX, пожалуйста. Я тоже одно время долго парился с дженериками и дописал пару классов, а потом уже от них наследуюсь, чтобы каждый раз не прописывать if - onSuccess, else - onError. Позже допишу код, если требуется.
0
08.12.2016, 13:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2016, 13:01
Привет! Вот еще темы с ответами:

Ошибка JSON в Retrofit - Программирование Android
Всем привет! Недавно начал изучение Retrofit как известной библиотеки для REST-запросов. Там всё сильно автоматизировано, например,...

Разницы между OkHTTP AND Retrofit - Программирование Android
Добрый вечер, ребята в чем разница между Retrofit и okHTTP это код Retrofit Retrofit retrofit = new Retrofit.Builder() ...

Работа с SOAP с помощью retrofit - Программирование Android
работа с SOAP с помощью retrofit или похожей библиотекой.. Ребята подскажите как работать с этим чудом SOAP? Как намного проще?

Retrofit 2, POST запрос, авторизация - Программирование Android
Добрый день! На собеседовании (Junior Android Dev) мне дали задание написать приложение с авторизацией. Вот текст задачи: Все методы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru