Miguel. Is this method not called if its reaction to success?
For all status codes <200 or status code> 200, a salvo calls the parseNetworkError (VolleyError volleyError) method instead of the parseNetworkResponse (NetworkResponse response) method. Look at here -
https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java
Line Number -118-120
if (statusCode < 200 || statusCode > 299) { throw new IOException(); }
and corresponding block block Line number - 128 -151
catch (IOException e) { int statusCode = 0; NetworkResponse networkResponse = null; if (httpResponse != null) { statusCode = httpResponse.getStatusLine().getStatusCode(); } else { throw new NoConnectionError(e); } VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl()); if (responseContents != null) { networkResponse = new NetworkResponse(statusCode, responseContents, responseHeaders, false); if (statusCode == HttpStatus.SC_UNAUTHORIZED || statusCode == HttpStatus.SC_FORBIDDEN) { attemptRetryOnException("auth", request, new AuthFailureError(networkResponse)); } else { // TODO: Only throw ServerError for 5xx status codes. throw new ServerError(networkResponse); } } else { throw new NetworkError(networkResponse); } }
If you want to override this behavior, you can add your specific implementation of the status code to the BasicNetwork.java-> performRequest method.
Edit: Therefore, this is not due to a status code, but because of an empty response. Well, I think you are doing the right thing by implementing your own request class. Volley comes with several predefined popular request types for ease of use, but you can always create your own. Instead of implementing on the basis of a status code, I would simply ask to check if the next line is left before deserialization -
String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); if (!jsonString .isEmpty()) { return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } else { return Response.success(new JSONObject(), HttpHeaderParser.parseCacheHeaders(response)); }
** did not test this, but you got the point :)
Gaurav
source share