Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Rom96
0 / 0 / 2
Регистрация: 07.11.2014
Сообщений: 35
#1

Retrofit 2. Возвращаемое значение == null - Программирование Android

18.09.2016, 17:48. Просмотров 902. Ответов 4

Делаю небольшое приложение для VK. Решил использовать Retrofit 2. Набросал простенький запрос, но в ответ приходит код 200 и null.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface ApiInterface {
 
public static final String BASE_URL = "https://api.vk.com/method/";
 
@GET("users.get?user_ids=210700286&v=5.53")
Call<ProfileInfo> getProfileInfo();
 
 
public static final Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
}
Вот что в Activity

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
ApiInterface apiInterface = ApiInterface.retrofit.create(ApiInterface.class);
    Log.d("123", "After RETROFIT CLIENT " + mAccount.getAccessToken());
 
 
 
 
        Call<ProfileInfo> call = apiInterface.getProfileInfo();
        call.enqueue(new Callback<ProfileInfo>() {
            @Override
            public void onResponse(Call<ProfileInfo> call, Response<ProfileInfo> response) {
                Log.d("123", "IN QUERY " + response.code());    /*response.code == 200*/
 
                  ProfileInfo profileInfo = response.body();   /*Возвращает null*/
 
                    Log.d("123", profileInfo.toString());
 
                }
            }
 
            @Override
            public void onFailure(Call<ProfileInfo> call, Throwable t) {
 
            }
        });
Модель

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
public class ProfileInfo {
 
@SerializedName("id")
public int ID;
@SerializedName("first_name")
public String firstName;
@SerializedName("last_name")
public String lastName;
 
 
 
public String getFirstName() {
    return firstName;
}
 
public void setFirstName(String firstName) {
    this.firstName = firstName;
}
 
public String getLastName() {
    return lastName;
}
 
public void setLastName(String lastName) {
    this.lastName = lastName;
}
 
@Override
public String toString() {
    String s;
    return s= getFirstName() + " " + getLastName();;
}
}
Ответ в виде

JSON
1
2
3
4
5
response: [{
id: 210700286,
first_name: 'Lindsey',
last_name: 'Stirling'
}]
Пробовал через errorBody, приложение крашится.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2016, 17:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Retrofit 2. Возвращаемое значение == null (Программирование Android):

Retrofit2. Возвращаемое значение body null
Читал похожую тему здесь и в других местах, но хоть убей не могу понять где...

Retrofit Recyclerview
Здравствуйте, уважаемые форумчане. Помогите добавить onScroll в...

Библиотека Retrofit
Мне нужно освоить библиотеку Retrofit.Я нашол урок...

Retrofit trouble
По тз нужно написать POST запрос через retrofit, Я создал его, но приложение...

Retrofit, JSON, @POST, @GET
Уважаемые программисты, прошу вашей помощи! Хожу на курсы по разработке...

OPTIONS запросы в Retrofit
Всем привет, никто не сталкивался с данным вопросом? Я нашел в репозитории...

4
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
18.09.2016, 21:07 #2
Лучший ответ Сообщение было отмечено Rom96 как решение

Решение

Цитата Сообщение от Rom96 Посмотреть сообщение
Пробовал через errorBody, приложение крашится.
Модель у вас не правильная.

Должно быть примерно так:

MainActivity

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
public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        ApiInterface vkService= ApiInterface.retrofit.create(ApiInterface.class);
        Call<ProfileInfo> call=vkService.getProfileInfo("210700286","5.53");
 
        call.enqueue(new Callback<ProfileInfo>() {
            @Override
            public void onResponse(Call<ProfileInfo> call, retrofit2.Response<ProfileInfo> response) {
                ArrayList<Response> userArray=response.body().getResponse();
                for(Response user:userArray){
                    Toast.makeText(MainActivity.this, "First Name: "+user.getFirstName()+"\n" +
                            "Last Name: "+user.getLastName()+"\n"+"ID: "+user.getId(), Toast.LENGTH_SHORT).show();
                }
 
            }
 
            @Override
            public void onFailure(Call<ProfileInfo> call, Throwable t) {
                Toast.makeText(MainActivity.this, ""+t, Toast.LENGTH_SHORT).show();
            }
        });
 
    }
}
Retrofit API
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface ApiInterface {
 
    public static final String BASE_URL = "https://api.vk.com/method/";
 
    @GET("users.get?")
    Call<ProfileInfo> getProfileInfo(
            @Query("user_ids") String user_ids,
            @Query("v") String version
    );
    public static final Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}
И модель состоящая из двух класов:

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
public class ProfileInfo {
    @SerializedName("response")
    private ArrayList<Response> response = new ArrayList<Response>();
    public ArrayList<Response> getResponse() {
        return response;
    }
    public void setResponse(ArrayList<Response> response) {
        this.response = response;
    }
 
}
 
public class Response {
 
    @SerializedName("id")
    private int id;
    @SerializedName("first_name")
    private String firstName;
    @SerializedName("last_name")
    private String lastName;
 
 
    public int getId() {
        return id;
    }
    public void setId(int id) {this.id = id;}
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
}
1
Rom96
0 / 0 / 2
Регистрация: 07.11.2014
Сообщений: 35
19.09.2016, 19:03  [ТС] #3
Спасибо!

Добавлено через 18 часов 18 минут
Скажите, выходит, грубо говоря для каждого запроса необходимо делать 2 класса модели? Для самого объекта ответа и для его полей?
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
19.09.2016, 19:28 #4
Цитата Сообщение от Rom96 Посмотреть сообщение
для каждого запроса необходимо делать 2 класса модели? Для самого объекта ответа и для его полей?
Один класс - для полей (для каждого запроса - отдельный класс). В другом классе можно хранить список запросов, ни к чему создавать каждый раз отдельный класс. Также можно создать для обработки ошибок отдельные классы со список полей. Их структура зависит от того, что будет присылать сервер вместе с ошибкой.
0
fraley
110 / 110 / 43
Регистрация: 24.05.2015
Сообщений: 329
19.09.2016, 20:33 #5
Цитата Сообщение от Rom96 Посмотреть сообщение
Скажите, выходит, грубо говоря для каждого запроса необходимо делать 2 класса модели? Для самого объекта ответа и для его полей?
Ну так это же зависит от того какой ответ приходит от сервера.
Может быть такой, что потребуется с десяток классов, чтоб Retrofit его корректно распарсил.
Я лично пользуюсь этим сайтом для получения моделей:
http://www.jsonschema2pojo.org/
1
19.09.2016, 20:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2016, 20:33
Привет! Вот еще темы с решениями:

Ошибка JSON в Retrofit
Всем привет! Недавно начал изучение Retrofit как известной библиотеки для...

Прокладывание маршрута и Retrofit
Добрый день. Есть проблема с реализацией маршрутов в приложении. Суть проста:...

Retrofit 2 post запрос
Делал реализацию клиент-сервер, в андроид при помощи retrofit. и встретился с...

Разницы между OkHTTP AND Retrofit
Добрый вечер, ребята в чем разница между Retrofit и okHTTP это код...


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

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

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