2014-10-02 1 views
11

Utilizzando uno di questi esempi: http://developer.android.com/training/volley/request.htmlCome accedere al contenuto di una risposta di errore nel Volley?

comprendo come elaborare la risposta di una richiesta di successo, e come individuare e correggere un errore.

Tuttavia, un errore può essere (tra le altre situazioni) un 40x o 50x risposta dal server, nel qual caso la reazione può ancora contenere dati (intestazione e corpo).

Tuttavia, al listener di errori viene passato solo un oggetto VolleyError (che è una sottoclasse di Exception se non mi sbaglio) e non un oggetto Response.

Come posso accedere al contenuto di una risposta di errore?

risposta

4

In StringRequest ad esempio:

@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 
    Map<String, String> responseHeaders = response.headers; 
    if response.statusCode == 401) { 
     // Here we are, we got a 401 response and we want to do something with some header field; in this example we return the "Content-Length" field of the header as a succesfully response to the Response.Listener<String> 
     Response<String> result = Response.success(responseHeaders.get("Content-Length"), HttpHeaderParser.parseCacheHeaders(response)); 
     return result; 
    } 
    return super.parseNetworkResponse(response); 
} 
+0

C'è un '(' manca in istruzione, grazie per la risposta :) –

23

L'oggetto VolleyError ha un riferimento networkResponse, che a sua volta ha un membro di 'dati', che è una matrice di byte del corpo della risposta. Se si desidera visualizzare i dati in caso di un codice di errore in risposta, è possibile utilizzare qualcosa di simile:

@Override 
public void onErrorResponse(VolleyError error) { 
    String body; 
    //get status code here 
    String statusCode = String.valueOf(error.networkResponse.statusCode); 
    //get response body and parse with appropriate encoding 
    if(error.networkResponse.data!=null) { 
     try { 
      body = new String(error.networkResponse.data,"UTF-8"); 
     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } 
    } 
    //do stuff with the body... 
}