Как отправлять запрос и получать ответ (вложенный JSON) с помощью модернизации Android

#java #android #api #rest #retrofit

#java #Android #API #отдых #модернизация

Вопрос:

вот вложенный запрос JSON

 {
"user": {
    "email": "123@mail.com",
    "password": "12345678"
    }
}
 

вот вложенный ответ JSON

 {
    "data": {
        "renew_token": "e994c4d2-d93b-47e8-ab5f-9090b823f249",
        "token": "419fff70-b1ee-4ea7-b636-ddbec6346794"
    }
}
 

я могу отправить запрос, но я изо всех сил пытаюсь закодировать ответ в том же процессе

мой интерфейс в настоящее время

 public interface JsonApi {

    @POST("session")
    Call<RootUser> userLogin(@Body RootUser rootUser);
}
 

Модель для запроса

 public class User{
    public String email;
    public String password;
}

public class RootUser{
    public User user;
}
 

вызов API

 private void userLogin(){
        String email = etloginemail.getText().toString();
        String password = etloginpassword.getText().toString();

        Retrofit retrofit = new Retrofit.Builder().baseUrl("https://the-digest-app.herokuapp.com/api/")
                                        .addConverterFactory(GsonConverterFactory.create())
                                        .build();

        JsonApi jsonApi = retrofit.create(JsonApi.class);

        User user = new User(email, password);
        RootUser rootUser = new RootUser(user);

        Call<RootUser> call = jsonApi.userLogin(rootUser);

        call.enqueue(new Callback<RootUser>() {
            @Override
            public void onResponse(Call<RootUser> call, Response<RootUser> response) {
                Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
                         }

            @Override
            public void onFailure(Call<RootUser> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_LONG).show();
            }
        });

    }
 

Как определить функцию получения ответа? если я сделал что-то не так, пожалуйста, скажите мне!

Комментарии:

1. Ваш запрос и ответ отличаются! Вам понадобятся разные POJO, как сказал @mehmet. Откуда мы это знаем? И запрос, и ответ содержат два ключа типа string, но оба имеют разные имена ключей!

Ответ №1:

Вы должны создать еще один POJO для ответа типа

 public class LoginResponse{
    @SerializedName("renew_token")
    public String renewToken;
    @SerializedName("token")
    public String token;
}

public class UserLoginResponse{
    public LoginResponse data;
}
 

и ваш модифицированный интерфейс должен выглядеть следующим образом

 public interface JsonApi {

    @POST("session")
    Call<UserLoginResponse> userLogin(@Body RootUser rootUser);
}
 

и реализация вашего вызова

 call.enqueue(new Callback<UserLoginResponse>() {
            @Override
            public void onResponse(Call<UserLoginResponse> call, Response<UserLoginResponse> response) {
                Toast.makeText(LoginActivity.this, "Success", Toast.LENGTH_LONG).show();
                         }

            @Override
            public void onFailure(Call<UserLoginResponse> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_LONG).show();
            }
        });
 

Комментарии:

1. Я создал POJO и отредактировал интерфейс, можете ли вы помочь мне с вызовом get response? я борюсь, потому что он во вложенном формате json.

2. Я отредактировал свой ответ и добавил реализацию.

3. Спасибо за вашу помощь! извините, если мои вопросы недостаточно ясны, но я на самом деле прошу код для получения ответа «token» и «renew_token» для хранения внутри класса LoginResponse. Если вы можете помочь, это было бы очень ценно!

4. Неважно, я уже понял это. Было бы невозможно без вашей помощи, хотя 🙂