Проблема с получением данных ответа json с помощью Retrofit

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

ЗАВИСИМОСТИ:

//// retrofit, gson
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.github.bumptech.glide:glide:3.7.0'

implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'

1. RetrofitClient:

public class RetrofitClient {

private static Retrofit retrofit = null;


 public static Retrofit getRetofitClient(String BaseUrl) {
    retrofit=null;
    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BaseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(new OkHttpClient.Builder()
                        .addInterceptor(new LoggingInterceptor()).build())
                .build();
    }
    return retrofit;
}

2. RetrofitListener: - мой интерфейс

public interface RetrofitListener<T>  {
 void handleSuccessResponse(T response,int type);
 void handleError(T error);}

3. Параметры запроса - мой класс параметра запроса

public class RequestParameters {

public static Map<String,String> login(String username,String password,String device_token,String device_type){
    Map<String,String> requestBody=new HashMap<>();
    requestBody.put("username",username);
    requestBody.put("password",password);
    requestBody.put("device_token",device_token);
    requestBody.put("device_type",device_type);
    return requestBody;
}}

4. ApiPresenter -my api класс презентатора

public class ApiPresenter {

private RetrofitListener mListener;
private ApiInterface mInterface;
private Activity mActivity;
public ProgressDialog p;

public ApiPresenter(Activity activity,RetrofitListener listener,ApiInterface serviceInterface){
    this.mListener=listener;
    this.mInterface=serviceInterface;
    this.mActivity=activity;
}

public void showProgressDialog(){
    p=new ProgressDialog(mActivity);
    p.setMessage(mActivity.getResources().getString(R.string.strLoading));
    p.requestWindowFeature(Window.FEATURE_NO_TITLE);
    p.setCancelable(false);
    if (p!=null && !p.isShowing()){
        p.show();
    }
}

public void dismissDialog(){
    if (p!=null && p.isShowing()){
        p.dismiss();
    }
}

public Call<User> login(Map<String,String> params, final int requestCode, boolean isShowDialog){

    Log.e("PARAMS >> USERNAME : ",params.get("username"));
    Log.e("PARAMS >> PASSWORD :",params.get("password"));

    if (isShowDialog)
        showProgressDialog();

    Call<User> call = mInterface.login(params);
    call.enqueue(new Callback<User>() {
        @Override
        public void onResponse(Call<User> call, Response<User> response) {
            dismissDialog();
            if (mListener!=null){
                mListener.handleSuccessResponse(response.body(),requestCode);

            }
        }

        @Override
        public void onFailure(Call<User> call, Throwable t) {
          dismissDialog();
          mListener.handleError(t.getMessage());
        }
    });

    return null;
}
public Call<User> signup(Activity activity, Map<String, String> params, final int requestCode, boolean isShowDialog) {

        if (isShowDialog) {
            showProgressDialog(activity);
        }
        Call<SignUpModel> userCall = apiService.signup(params);
        userCall.enqueue(new Callback<SignUpModel>() {
            @Override
            public void onResponse(Call<SignUpModel> call, Response<SignUpModel> response) {

                dismisProgressDialog();
                listener.handleSuccessResponse(response.body(), requestCode);
            }

            @Override
            public void onFailure(Call<SignUpModel> call, Throwable t) {
                Log.e("Failure", "= = " + t.getMessage());
                dismisProgressDialog();
                listener.handleErrorResponse(t.getMessage());
            }
        });

        return null;
    }
    public Call<ResultData> getResults(Activity activity, String input,String format, final int requestCode, boolean isShowDialog) {

        if (isShowDialog) {
            showProgressDialog(activity);
        }
        Call<ResultData> userCall = apiService.getVin(input,format);
        userCall.enqueue(new Callback<ResultData>() {
            @Override
            public void onResponse(Call<ResultData> call, Response<ResultData> response) {

                dismisProgressDialog();
                listener.handleSuccessResponse(response.body(), requestCode);
            }

            @Override
            public void onFailure(Call<ResultData> call, Throwable t) {
                Log.e("Failure", "= = " + t.getMessage());
                dismisProgressDialog();
                listener.handleErrorResponse(t.getMessage());
            }
        });

        return null;
    }
}}

5.User.java - мой класс модели

public class User {
    private Integer status;
    private Data data;
    private String message;

    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
    public Data getData() {
        return data;
    }
    public void setData(Data data) {
        this.data = data;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    class Data {
        @SuppressLint("id")
        private String id;
        @SuppressLint("first_name")
        private String firstName;
        @SuppressLint("last_name")
        private String lastName;
        @SuppressLint("email")
        private String email;
        @SuppressLint("username")
        private String username;
        @SuppressLint("password")
        private String password;
        @SuppressLint("photo")
        private String photo;
        @SuppressLint("birthdate")
        private String birthdate;
        @SuppressLint("gender")
        private String gender;
        @SuppressLint("token")
        private String token;
        @SuppressLint("device_type")
        private String deviceType;
        private Map<String, Object> additionalProperties = new HashMap<String, Object>();
        public String getId() {
            return id;
        }
        public void setId(String 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;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getPhoto() {
            return photo;
        }
        public void setPhoto(String photo) {
            this.photo = photo;
        }
        public String getBirthdate() {
            return birthdate;
        }
        public void setBirthdate(String birthdate) {
            this.birthdate = birthdate;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public String getToken() {
            return token;
        }
        public void setToken(String token) {
            this.token = token;
        }
        public String getDeviceType() {
            return deviceType;
        }
        public void setDeviceType(String deviceType) {
            this.deviceType = deviceType;
        }
    }}

6. Звонок - вызов службы входа в систему при нажатии кнопки

public void login(View view) {

    if (isNetworkConnected(MainActivity.this)){
        new ApiPresenter(MainActivity.this,this,apiService)
                .login( RequestParameters.login("jaimin","123456","devicetoken","0"),CODE_LOGIN,true);
    }else{
        Toast.makeText(this, ""+getResources().getString(R.string.toast_check_internet), Toast.LENGTH_SHORT).show();
    }
}

7. Мой метод HandleResponse - метод переопределения интерфейса

@Override
public void handleSuccessResponse(Object response, int type) {
    switch(type){
        case CODE_REGISTER_USER:

            if (response instanceof UserModel)
                handleResponseCatAssignProductList((UserModel) response);

            break;

        case CODE_LOGIN:
            if (response instanceof User){
                handleLoginREsponse((User)response);
            }
            break;

        case CODE_SIGNUP:
            if (response instanceof SignUpModel){
                handleSignupREsponse((SignUpModel)response);
            }
            break;
    }
}

8. АПИСЕРВИС

public interface ApiService {

@FormUrlEncoded
@POST("webservice/login")
Call<User> login(@FieldMap Map<String, String> params);

@FormUrlEncoded
@POST("webservice/signup")
Call<UserModel> register(@FieldMap Map<String, String> params);

@Headers("Authorization:U2FsdGVkX1+2uAhde5/Z1w/k = ")
@POST("customerRegistration.php")
Call<SignUpModel> signup(@Body Map<String,String> params);

@GET("/api/vehicles/DecodeVinValues/{input}")
Call<ResultData> getVin(@Path("input") String input, @Query("format") String format);

@GET("FlowersList.php")
Call<JsonArray> getFlower();}

ПРОБЛЕМА : Я получаю ответ. Но данные становятся нулевыми. В ответ я получаю Пожалуйста, укажите имя пользователя и пароль.

В logcat я получаю:

10-12 14:42:42.436 3387-3387/com.example.jaimin.retrofitcommondemo E/PARAMS >> USERNAME :: jaimin
    10-12 14:42:42.436 3387-3387/com.example.jaimin.retrofitcommondemo E/PARAMS >> PASSWORD :: 123456
    10-12 14:47:06.788 3387-3387/com.example.jaimin.retrofitcommondemo E/<<<<<<< response: >>User and password could not be null

В чем может быть проблема?

РЕДАКТИРОВАТЬ

моя строка JSON:

{
   "status":1,
   "data":{
      "id":"591",
      "first_name":"jaimin",
      "last_name":"modi",
      "email":"[email protected]",
      "username":"jaimin",
      "password":"e1ba59abbe56e057f20f883e",
      "photo":"http:temp.jpg",
      "birthdate":"1992-12-24",
      "gender":"",
      "token":"dsfsf",
      "device_type":"0"
   },
   "message":"Successful Login"
}

9. РЕГИСТРАТОР-ПЕРЕРАБОТЧИК

public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
    Request request = chain.request();
    Response response = chain.proceed(request);
    final String responseString = new String(response.body().bytes());
    Log.e("REsponse", "Response: " + responseString);
    return response.newBuilder()
            .body(ResponseBody.create(response.body().contentType(), responseString))
            .build();
}}

Что такое строка JSON?

Pankaj Kumar 12.10.2018 11:20

да, сэр, вопрос редактирования ...

Jaimin Modi 12.10.2018 11:21

да, сэр, я отлаживал и получаю такую ​​проблему. Я добавил мою строку JSON, пожалуйста. ччек.

Jaimin Modi 12.10.2018 11:30

@PankajKumar Я добавил строку JSON.

Jaimin Modi 12.10.2018 11:32

Если вы действительно отлаживали его, должно быть описание лучше, чем «возникла какая-то проблема».

James Z 12.10.2018 14:32
2
5
1 482
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Измените видимость класса Data на общедоступный.

Вместо того

class Data {
}

Использовать

public class Data {
}

Сэр, я сделал это: Public static .. а затем я изменил тост как: Toast.makeText (this, "" + response.getData (). GetEmail (), Toast.LENGTH_SHORT) .show (); .. Итак, ошибка ниже в logcat: "java.lang.NullPointerException: Попытка вызвать виртуальный метод" java.lang.String com.example.jaimin.retrofitcommondemo.models.User $ Data.getEm‌ ail () 'на ссылка на нулевой объект "

Jaimin Modi 12.10.2018 12:05

Получение java.lang.NullPointerException: попытка вызвать виртуальный метод java.lang.String com.example.jaimin.retrofitcommondemo.models.User $ Data.getEm‌ ail () 'для ссылки на нулевой объект при отображении электронной почты из getData () ..

Jaimin Modi 12.10.2018 12:06

Почему вы используете теги @SuppressLint? по какой-то причине, или вы по ошибке воспользовались?

Pankaj Kumar 12.10.2018 12:11

Сэр, я удалил его и попытался снова ... получить то же самое в logcat.

Jaimin Modi 12.10.2018 12:16

Это тег SerializedName, который вам нужен. Но вы говорите, что после удаления @SuppressLint он также не работает?

Pankaj Kumar 12.10.2018 12:25

Вы получаете статус и сообщение?

Pankaj Kumar 12.10.2018 12:26

Да, сэр, сообщение: «Пользователь и пароль не могут быть нулевыми», а статистика равна 0.

Jaimin Modi 12.10.2018 12:38

Позвольте нам продолжить обсуждение в чате.

Pankaj Kumar 12.10.2018 14:01

Сэр, я нашел решение, заменив «@Body» на «@FieldPart» вместе с «@FormUrlencoded». Также добавил это в ответ, пожалуйста. проверить.

Jaimin Modi 18.10.2018 08:04

@JaiminModi отлично. И очень хорошо добавить свое решение, которое может помочь другим в подобной ситуации. Продолжайте делать добрые дела

Pankaj Kumar 18.10.2018 08:14
Ответ принят как подходящий

Я нашел решение своего вопроса, как показано ниже:

Все правильно в моем вопросе. Но, кое-что, что мы должны помнить, имея дело с дооснащением:

  1. Вы можете использовать @Поле, если вы передаете одно значение форма вместе с @FormUrlEncoded ..

  2. Вы можете использовать @FieldMap, если вы передаете несколько значений с помощью КАРТА вместе с @FormUrlEncoded.

  3. Вы можете использовать @Запрос для передачи значений параметра url.

  4. Вы можете использовать @Тело в случае, если вы передаете данные json в веб-сервис.

Примечание. Если ваш сервер требует данных json с нашей стороны, используйте @Тело, а если они требуют данных формы, используйте @FieldPart.

Итак, в моем случае выше я должен использовать @FiledMap вместе с @FormUrlEncoded вместо @Тело. Вот в чем проблема. Простой !!

ИСПОЛЬЗОВАЛ:

@FormUrlEncoded
@POST("signup")
Call<UserModel> register(@FieldMap Map<String, String> params);

ВМЕСТО ТОГО:

@POST("signup")
Call<UserModel> register(@Body Map<String, String> params);

Другие вопросы по теме