Herumspielen mit der Volley-Bibliothek, bemerkte ich, dass bei der Erstellung eines POST JsonObjectRequest
, wenn der Server einen Code 304 oder 200 ohne Daten in der Antwort (response.data)
zurückgibt, interpretiert Volley es als Fehlerreaktion statt eines Erfolges.Volley Ausnahmefehler, wenn Antwortcode 304 und 200
Ich es zu lösen, indem Sie ein paar Zeilen Code in der Methode Response<JSONObject> parseNetworkResponse(NetworkResponse response)
in der Klasse JsonObjectRequest.java
hinzufügen.
@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?
Danke!
EDIT
Überprüfung der Klasse BasicNetwork.java
erkannte ich, dass Volley prüft, ob eine Antwort keine Daten durch, wenn httpResponse.getEntity() != null
zu fragen.
// 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];
}
Aber das Problem ist immer noch die JSONException das auftritt, wenn Volley versucht, eine neue Zeichenfolge mit response.data == new byte[0]
im parseNetworkResponse Methode zu erstellen.
Die Problem ist, wenn der Code 200 oder der Code 304 (nicht modifiziert) keine Daten zurückgeben, habe ich den Beitrag bearbeitet. – Miguel
welche Version von Volley verwenden Sie. Der Master-Zweig https://android.googlesource.com/platform/frameworks/volley/+/master/src/com/android/volley/toolbox/BasicNetwork.java hat nichts, was zu einem Fehler führen würde, wenn keine Daten vorhanden sind Antwort. Stattdessen haben sie in diesem Fall eine 0-Byte-Antwort hinzugefügt. Zeilennummer 106-112 – Gaurav
Wenn Sie versuchen, ein JSONObject aus einem String zu erstellen, der aus einem 0-Byte-Objekt erstellt wurde, wird eine JSONException ausgelöst. – Miguel