J'utilise l'API pour la connexion, si la connexion réussit, il renvoie le code 200 avec réponse. et si un e-mail ou un mot de passe incorrect renverra le code 401 avec l'objet json contenant des erreurs
le problème est que je veux obtenir la réponse du réseau même si le code de demande n'est pas égal à 200 comme l'image mais une exception de lancer de volée BasicNetwork.performRequest: Code de réponse inattendu 401
voici mon code
public interface OnResponse{ void onResponse(JSONObject response) throws Exception; void onErrorResponse(VolleyError volleyError); }//OnResponse public static void newRequest(Context context, String url, final Map<String, String>params, final OnResponse onResponse){ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - RequestQueue queue = Volley.newRequestQueue(context); // //onErrorResponse() //onResponse() StringRequest stringRequest = new StringRequest(Request.Method.POST, url, response -> { // - - - - - - - - - - - - - - - - - - - - - try { JSONObject object = new JSONObject(response); onResponse.onResponse(object); } catch (Exception e) { Log.e(TAG, "FLAG-1"); e.printStackTrace(); } // - - - - - - - - - - - - - - - - - - - - - }, error -> { Log.e(TAG, "FLAG-2"); onResponse.onErrorResponse(error); }){ @Override protected VolleyError parseNetworkError(VolleyError volleyError) { volleyError.printStackTrace(); Log.e("zxc", volleyError.getMessage()+""); Log.e("zxc", volleyError.getLocalizedMessage()+""); return super.parseNetworkError(volleyError); } }; // stringRequest.setParams(params); stringRequest.setShouldCache(false); queue.add(stringRequest); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }//newRequest()`
4 Réponses :
Remplacez simplement parseNetworkResponse
dans la méthode newRequest () comme ci-dessous
StringRequest request = new StringRequest(Method.GET, <your url>, new Response.Listener<String>() { @Override public void onResponse(String response) { //handle response } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { //handle error } }) { @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { int mStatusCode = response.statusCode; return super.parseNetworkResponse(response); } };
VolleyError
a l'attribut networkResponse
, il contient la réponse.
Voici un exemple: String response = new String (error.networkResponse.data);
Vous pouvez extraire les données de réponse de VolleyError
.
@Override public void onErrorResponse(VolleyError error) { NetworkResponse networkResponse = error.networkResponse; if (networkResponse != null && networkResponse.data != null) { String jsonError = new String(networkResponse.data); // Print Error! } }
Si le code d'état du réseau est autre que 4xx ou 5xx, Volley renvoie la réponse dans onErrorResponse
comme VolleyError
. La réponse est reçue sous forme de tableau d'octets, vous devez donc l'analyser pour lire l'erreur et les clés de message.
Vous trouverez ci-dessous une version réduite du code requis.
class ErrorResponse { @Expose @SerializedName("error") String error; @Expose @SerializedName("message") String message; }
et ErrorResponse
est une classe personnalisée avec des variables error
et message
.
final String failAuthError = new String(volleyError.networkResponse.data, Charset.forName("UTF-8")); ErrorResponse errorResponse = new Gson().fromJson(failAuthError, ErrorResponse.class); Log.e(TAG, "Error Status: " + errorResponse.error); Log.e(TAG, "Error Message: " + errorResponse.message);
p >
arrêtez d'utiliser volley et utilisez une autre bibliothèque http
vérifiez vos logs de zxc vous pourriez avoir la réponse ici