Android Rest身份验证不返回状态码或网络响应

Android Rest身份验证不返回状态码或网络响应,android,django,django-rest-framework,jwt,android-volley,Android,Django,Django Rest Framework,Jwt,Android Volley,我有一个android使用django REST API后端,其中包括基于令牌的身份验证。 问题是,每当用户提供错误的电子邮件或密码时,我希望下面的代码会出现403错误,但volley库不会得到响应代码 这是django rest中的备份服务 def api_authenticate_user(request): try: email = request.data['email'] password = request.data['password']

我有一个android使用django REST API后端,其中包括基于令牌的身份验证。 问题是,每当用户提供错误的电子邮件或密码时,我希望下面的代码会出现403错误,但volley库不会得到响应代码

这是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);

}

检查null指针以避免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");
}

在什么情况下,即使在API中将状态代码设置为403之后,网络响应也可以为空
 @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");
}