2
votes

Comment obtenir la réponse du réseau, même le code d'état n'est pas 200

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 postman response 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()`


2 commentaires

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


4 Réponses :


0
votes

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);
        }
    };


0 commentaires

2
votes

VolleyError a l'attribut networkResponse , il contient la réponse.

Voici un exemple: String response = new String (error.networkResponse.data);


0 commentaires

0
votes

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!
    }
 }


0 commentaires

0
votes

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 >


0 commentaires