Аутентификация Android Rest не возвращает код состояния или ответ сети - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть Android, использующий бэкэнд API REST django, который включает аутентификацию на основе токенов. Проблема заключается в том, что всякий раз, когда пользователь вводит неправильный адрес электронной почты или пароль, я ожидаю ошибку 403 из кода ниже, но библиотека залпа не получает код ответа.

Это служба в django rest.

def api_authenticate_user(request):
    try:
        email = request.data['email']
        password = request.data['password']
        user = authenticate(email=email, password=password)
        if user is not None:
            try:
                payload = jwt_payload_handler(user)
                token = jwt.encode(payload, settings.SECRET_KEY)
                user_logged_in.send(sender=user.__class__, request=request, user=user)
                user = User.objects.get(email=email)
                user_details = {'token': token, 'names': user.get_name(), 'id': user.id}
                return JsonResponse(user_details, status=status.HTTP_200_OK)
            except Exception as e:
                raise e
        else:
            return JsonResponse({'error': 'Invalid email address or password', 'status': status.HTTP_403_FORBIDDEN})
    except KeyError:
        return JsonResponse({'error': 'Provide email and password', 'status': status.HTTP_403_FORBIDDEN})

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

private void UserLoginTask(final String email, final String password) {
    StringRequest request = new StringRequest(Request.Method.POST, loginUrl , new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONObject userObj = new JSONObject(response);
                userSession.initializeSession(userObj.getString("names"), email, userObj.getString("token"));
                Intent intent = new Intent(Login.this, MainActivity.class);
                startActivity(intent);
                finish();
            } catch (JSONException e) {
                e.printStackTrace();
                errorText.setText("Could not process your request. Try again");
                errorText.setVisibility(View.VISIBLE);
                showProgress(false);
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            System.out.println(error.networkResponse);
            if(error.networkResponse.statusCode == 403){
                errorText.setText("Invalid email address or password");
            }else{
                errorText.setText("Could not process your request. Try again");
            }
            errorText.setVisibility(View.VISIBLE);
            showProgress(false);
        }
    }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<>();
            params.put("email", email);
            params.put("password", password);
            return params;
        }
    };

    RequestQueue queue = Volley.newRequestQueue(Login.this);
    queue.add(request);

}

Когда я пытаюсь войти в систему или получить статус ошибки, как показано в классе прослушивателя ошибок залпа, я получаю эту ошибку, показывающую, что состояние сети ответа равно нулю. Как я могу получить 403 или любой другой код состояния.

2019-04-15 22:24:46.461 31397-31397/com.example.phanue.antenatal E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.phanue.antenatal, PID: 31397
    java.lang.NullPointerException: Attempt to read from field 'int com.android.volley.NetworkResponse.statusCode' on a null object reference
        at com.example.phanue.antenatal.LoginData.Login$4.onErrorResponse(Login.java:153)
        at com.android.volley.Request.deliverError(Request.java:564)
        at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:101)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6942)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

1 Ответ

1 голос
/ 15 апреля 2019

Проверить нулевой указатель, чтобы избежать исключения NullPointerException

 @Override
    public void onErrorResponse(VolleyError error) {
        if (error != null && error.networkResponse != null && error.networkResponse.statusCode == 403) {
        errorText.setText("Invalid email address or password");
}
    else{errorText.setText("Could not process your request. Try again");
}
...