Android: Comment gérer les messages d’erreur du serveur en utilisant Volley?

J’utilise Volley pour mon application Android pour récupérer des données de mon serveur. Cela fonctionne bien sauf lors de la gestion de l’erreur de mon serveur. Mon serveur envoie cette réponse en cas d’erreur:

{ "status": 400, "message": "Errors (2): A name is required- Julien is already used. Not creating." } 

Mon but est d’obtenir le message et de l’afficher dans un Toast . J’ai suivi quelques exemples pour savoir comment procéder, mais cela ne fonctionne pas.

Il y a mon auditeur d’erreur:

 public void onErrorResponse(VolleyError error) { int statusCode = error.networkResponse.statusCode; NetworkResponse response = error.networkResponse; Log.d("testerror",""+statusCode+" "+response.data); // Handle your error types accordingly.For Timeout & No connection error, you can show 'retry' button. // For AuthFailure, you can re login with user credentials. // For ClientError, 400 & 401, Errors happening on client side when sending api request. // In this case you can check how client is forming the api and debug accordingly. // For ServerError 5xx, you can do retry or handle accordingly. if( error instanceof NetworkError) { } else if( error instanceof ClientError) { } else if( error instanceof ServerError) { } else if( error instanceof AuthFailureError) { } else if( error instanceof ParseError) { } else if( error instanceof NoConnectionError) { } else if( error instanceof TimeoutError) { } showProgress(false); mPasswordView.setError(getSsortingng(R.ssortingng.error_incorrect_password)); mPasswordView.requestFocus(); } 

Et là le résultat de mon débogueur: testerror ﹕ 400 [B @ 430b8d60

EDIT: D’ailleurs mon error.getMessage () est null.

Je ne comprends donc pas pourquoi ma variable response.data n’est pas la réponse de mon serveur.

Si quelqu’un sait comment recevoir le message de mon serveur, ce sera cool.

THX,

J’ai implémenté quelque chose de similaire et c’est relativement simple. Votre message de journal imprime ce qui ressemble à du charabia, car response.data est en réalité un tableau d’octets, pas une Ssortingng . De même, une VolleyError n’est en réalité qu’une Exception étendue. Par conséquent, Exception .getMessage () ne renverra probablement pas ce que vous recherchez, à moins que vous ne VolleyError méthodes d’parsing pour parsingr votre VolleyError dans votre classe Request étendue. Une façon très simple de gérer cela serait de faire quelque chose comme:

 //In your extended request class @Override protected VolleyError parseNetworkError(VolleyError volleyError){ if(volleyError.networkResponse != null && volleyError.networkResponse.data != null){ VolleyError error = new VolleyError(new Ssortingng(volleyError.networkResponse.data)); volleyError = error; } return volleyError; } } 

Si vous ajoutez ceci à vos classes Request étendues, votre getMessage() ne devrait au moins pas retourner null. Mais normalement, je ne m’en préoccupe pas vraiment, car il est assez facile de tout faire depuis la onErrorResponse(VolleyError e) .

Vous devez utiliser une bibliothèque JSON pour simplifier les choses – j’utilise par exemple Gson ou vous pouvez utiliser les JSONObject d’Apache qui ne nécessitent pas de bibliothèque externe supplémentaire. La première étape consiste à obtenir la réponse JSON envoyée par votre serveur en tant que Ssortingng (de la même manière que ce que je viens de démontrer), puis à le convertir en JSONObject (en utilisant JSONObject et JsonArray , ou une autre bibliothèque). de votre choix) ou simplement parsingr la Ssortingng vous-même. Après cela, il vous suffit d’afficher le Toast .

Voici un exemple de code pour vous aider à démarrer:

 public void onErrorResponse(VolleyError error) { Ssortingng json = null; NetworkResponse response = error.networkResponse; if(response != null && response.data != null){ switch(response.statusCode){ case 400: json = new Ssortingng(response.data); json = sortingmMessage(json, "message"); if(json != null) displayMessage(json); break; } //Additional cases } } public Ssortingng sortingmMessage(Ssortingng json, Ssortingng key){ Ssortingng sortingmmedSsortingng = null; try{ JSONObject obj = new JSONObject(json); sortingmmedSsortingng = obj.getSsortingng(key); } catch(JSONException e){ e.printStackTrace(); return null; } return sortingmmedSsortingng; } //Somewhere that has access to a context public void displayMessage(Ssortingng toastSsortingng){ Toast.makeText(context, toastSsortingng, Toast.LENGTH_LONG).show(); } 

essayez cette classe pour gérer tous les erros

 public class VolleyErrorHelper { /** * Returns appropriate message which is to be displayed to the user * against the specified error object. * * @param error * @param context * @return */ public static Ssortingng getMessage (Object error , Context context){ if(error instanceof TimeoutError){ return context.getResources().getSsortingng(R.ssortingng.timeout); }else if (isServerProblem(error)){ return handleServerError(error ,context); }else if(isNetworkProblem(error)){ return context.getResources().getSsortingng(R.ssortingng.nointernet); } return context.getResources().getSsortingng(R.ssortingng.generic_error); } private static Ssortingng handleServerError(Object error, Context context) { VolleyError er = (VolleyError)error; NetworkResponse response = er.networkResponse; if(response != null){ switch (response.statusCode){ case 404: case 422: case 401: try { // server might return error like this { "error": "Some error occured" } // Use "Gson" to parse the result HashMap result = new Gson().fromJson(new Ssortingng(response.data), new TypeToken>() { }.getType()); if (result != null && result.containsKey("error")) { return result.get("error"); } } catch (Exception e) { e.printStackTrace(); } // invalid request return ((VolleyError) error).getMessage(); default: return context.getResources().getSsortingng(R.ssortingng.timeout); } } return context.getResources().getSsortingng(R.ssortingng.generic_error); } private static boolean isServerProblem(Object error) { return (error instanceof ServerError || error instanceof AuthFailureError); } private static boolean isNetworkProblem (Object error){ return (error instanceof NetworkError || error instanceof NoConnectionError); }