Volley-Ausnahmefehler bei Antwortcode 304 und 200
Als ich mit der Volley-Bibliothek herumspielte, bemerkte ich das beim Erstellen eines POSTJsonObjectRequest
, wenn der Server einen Code 304 oder 200 ohne Daten in der Antwort zurückgibt(response.data)
, Volley interpretiert es als Fehlerantwort, anstatt als Erfolg.
Ich schaffe es, es zu lösen, indem ich der Methode ein paar Zeilen Code hinzufügeResponse<JSONObject> parseNetworkResponse(NetworkResponse response)
in der KlasseJsonObjectRequest.java
.
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
if (!response.notModified) {// Added for 304 response
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} else // Added for 304 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
Log.v("Volley", "UnsupportedEncodingException " + response.statusCode);
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(), HttpHeaderParser.parseCacheHeaders(response));
else
return Response.error(new ParseError(e));
} catch (JSONException je) {
Log.v("Volley", "JSONException " + response.statusCode);
if (response.statusCode == 200)// Added for 200 response
return Response.success(new JSONObject(),HttpHeaderParser.parseCacheHeaders(response));
else
return Response.error(new ParseError(je));
}
}
Ist es die beste Lösung für dieses Problem?
Vielen Dank!
BEARBEITEN
Überprüfung der KlasseBasicNetwork.java
Ich erkannte, dass Volley prüft, ob eine Antwort keine Daten enthält, indem er fragt, obhttpResponse.getEntity() != null
.
// Some responses such as 204s do not have content. We must check.
if (httpResponse.getEntity() != null) {
responseContents = entityToBytes(httpResponse.getEntity());
} else {// Add 0 byte response as a way of honestly representing a
// no-content request.
responseContents = new byte[0];
}
Das Problem ist jedoch immer noch die JSONException, die auftritt, wenn Volley versucht, einen neuen String mit zu erstellenresponse.data == new byte[0]
in der parseNetworkResponse-Methode.