Как получить доступ к содержимому ответа об ошибке в 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...
}