получение нулевого ответа, если адрес электронной почты или пароль неверны в дооснащении 2 - PullRequest
0 голосов
/ 22 февраля 2019

Я использую веб-сервис для входа.Я получаю правильный ответ, если адрес электронной почты и пароль пользователя верны.но я получаю нулевое значение, если адрес электронной почты или пароль неверны.Я хочу получать сообщение с сервера, если адрес электронной почты или пароль неверны.Мой код ниже.

Call<LoginResponse> call = RetrofitClient.getInstance().getApi().userLogin(email, password);
    call.enqueue(new Callback<LoginResponse>() {
        @Override
        public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
            LoginResponse loginResponse = response.body();
            System.out.println("body " + response.body());
            System.out.println("response " + response.errorBody().toString());
            sharedPrefManager.cancelDialog();
            if (loginResponse != null) {
                if (loginResponse.getSuccess()) {
                    sharedPrefManager.saveUser(loginResponse.getData(), password);
                    Intent intent = new Intent(SignIn.this, MainActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(intent);
                } else {
                    Toast.makeText(SignIn.this, loginResponse.getMessage(), Toast.LENGTH_SHORT).show();
                }
            } else {
                SharedPrefManager.getInstance(SignIn.this).cancelDialog();

                    Toast.makeText(SignIn.this, response.message(), Toast.LENGTH_SHORT).show();

            }
        }

        @Override
        public void onFailure(Call<LoginResponse> call, Throwable t) {
            sharedPrefManager.cancelDialog();
            t.printStackTrace();
        }
    });

public class RetrofitClient {

private static final String BASE_URL = "my_base_url";
private static RetrofitClient mInstance;
private Retrofit retrofit;

OkHttpClient client = new OkHttpClient.Builder()
        //.addInterceptor(new SpeechRecognitionIntercepter())
        .connectTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS).build();

private RetrofitClient() {
    retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

public static synchronized RetrofitClient getInstance() {
    if (mInstance == null) {
        mInstance = new RetrofitClient();
    }
    return mInstance;
}

public Apis getApi() {
    return retrofit.create(Apis.class);
}

}

public interface Apis {


@FormUrlEncoded
@POST("login")
Call<LoginResponse> userLogin(@Field("email") String email, @Field("password") String password);

}

Неудачный вход в систему:

{"success":false, «message»: «Неверное имя пользователя или пароль».}

Успешный ответ:

{"success": true, "message": "", "data": {"token": "", "name ":" Gmail "," picture ":" "," userid ": 60," phone ":" (111) 114-4444 "," email ":" tahir123@gmail.com "," company_name ": null, "st_address": "Gmail account, Satellite", "location_id": 1, "account_type": 2}}

1 Ответ

0 голосов
/ 25 февраля 2019

Из вашего кода не совсем понятно, если вы получаете статус 200, даже если вызов не удался, но из того, что вы описываете, похоже, что вы получаете другой код состояния http.

Если это так,Дооснащение все еще вызывает метод onResponse, но response.isSuccessful() имеет значение false, и тело будет доступно через метод response.errorBody().

Простой способ получить это:

if(response.isSuccessful())
    // Do what you are doing
else {
      Gson gson = new Gson();
      LoginResponse error = gson.fromJson(response.errorBody().string());
      // Use the error variable now
 }

Здесь много чего происходит.Давайте начнем с того, зачем вам ручная десериализация.Retrofit не преобразует тело ошибки автоматически, вам нужно сделать это самостоятельно.Здесь я решил создать экземпляр Gson, который не элегантен, но служит цели.

Я также решил использовать string().Этот метод читает весь ответ в память и может привести к сбою для больших ответов.Его вызов опустошит буфер okhttp, а это значит, что вы не сможете вызывать его снова (насколько мне известно), поэтому держите его в переменной, если хотите использовать его несколько раз.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...