Как получить доступ к содержимому ответа об ошибке в Volley?

Используя любой из этих примеров: http://developer.android.com/training/volley/request.html

Я понимаю, как обрабатывать ответ успешного запроса и как обнаружить и отреагировать на ошибку.

Однако ошибка может быть (среди других ситуаций) ответом 40x или 50x от сервера, и в этом случае ответ может по-прежнему содержать данные (заголовки и тело).

Но слушателю ошибок передается только объект VolleyError (который является подклассом Exception, если я не ошибаюсь), а не объект Response.

Как мне получить доступ к контенту ответа об ошибке?

Ответ 1

В StringRequest, например:

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

Ответ 2

Объект VolleyError имеет ссылку networkResponse, которая сама имеет элемент данных, который является байтовым массивом тела ответа. Если вы хотите просмотреть данные в случае кода ошибки в ответ, вы можете использовать что-то вроде этого:

@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...
}