Android Rest身份验证不返回状态码或网络响应
我有一个android使用django REST API后端,其中包括基于令牌的身份验证。 问题是,每当用户提供错误的电子邮件或密码时,我希望下面的代码会出现403错误,但volley库不会得到响应代码 这是django 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']
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");
}