Antwortbehandlung mit Volley

8

Ich verwende Volley in meinem Projekt für die Bearbeitung von Netzwerkanforderungen. Hier ist ein Beispiel JSON mein Server gibt

zurück

JSON-Objektantwort

%Vor%

JSON-Array-Antwort

%Vor%

Wenn ein Validierungsfehler oder ein anderer Fehler auftritt, gibt der Server folgende Antwort zurück:

%Vor%

Das Problem liegt beim Parsen von Daten. Wenn die Anfrage erfolgreich ist, bekomme ich in onResponse von ResponseListener einfach den Inhalt von data key. Wobei, ich erwartete das Ergebnis genauso wie das, was ich oben gepostet habe. Ich verstehe nicht, warum Volley nur den Inhalt von data zurückgibt und nicht den Wert von JSON . Ich hatte Volley früher auch benutzt. Aber solche Probleme gab es nie.

Parsing-Code:

%Vor%

Antwort auf Erfolg:

%Vor%

In onResponse von ResponseListener , bekomme ich diese Daten:

%Vor%

Wenn ein Fehler auftritt, gibt der Server diese Antwort zurück:

%Vor%

Aus diesem Grund wirft Volley ParseException so wie es JSONArray erwartet. Ich muss die Fehlermeldung dem Benutzer zeigen. Früher habe ich AsyncTask benutzt und den Fehler dort behandelt. Aber mit Volley stehe ich vor Schwierigkeiten. Ich habe in VolleyError gesucht, aber keine Ahnung.

Update 1

%Vor%

Aktualisieren Bei diesem Problem ging es nicht um Volley . Auf dem Server gab es ein Problem mit der gzip-Komprimierung. Ich werde für das Schließen dieser Frage stimmen.

    
Nitish 31.08.2015, 04:56
quelle

7 Antworten

5
  

Aber wenn ein Fehler auftritt, erhalte ich eine Parse-Ausnahme, wenn ich eine Anfrage mache   für JSONArray

Verwenden Sie JSONObject. has () und JSONObject. isNull () , um vor der Analyse von json zu prüfen, welcher Schlüssel in der json-Antwort vorhanden ist.

Zum Beispiel:

%Vor%     
ρяσѕρєя K 31.08.2015 05:00
quelle
3

Im Falle eines Fehlers sollte Ihr Server den Fehler json mit dem HTTP-Statuscode 4xx zurückgeben. So entwerfen Sie Restful APIs. In der aktuellen Situation gibt Ihre API immer 2xx zurück, was dem erfolgreichen API-Ergebnis entspricht. Wenn Ihre API den korrekten HTTP-Antwortcode sendet, in diesem Fall 401 (nicht autorisiert) oder 403 (verboten) Verweise hier und dein ErrorListener wird von Volley aufgerufen. Sie müssen keine Parsing-Logik für die Fehlerreaktion in ResponseListener schreiben. Hier ist eine gute Ressource zum Verständnis der http-Statuscodes von Rest API.

    
JavaGhost 12.09.2015 20:37
quelle
2

Eine effiziente Methode zur Handhabung dieser Situation kann durch Analysieren von JSON-Werten mit GSON und Zuweisen der Schlüsselwerte mithilfe der POJO-Klasse erreicht werden.

Beispiel:

Fügen Sie ein Fehlerszenario in beiden Fällen wie JSONArray oder JSONObject hinzu. Finden Sie die Muster Ihres POJO für Ihre Testdaten wie folgt:

Beispiel 1

%Vor%

Beispiel 2

%Vor%

Erzeugen Sie GSON aus Ihrer Antwort und behandeln Sie sowohl das positive (Erfolg) als auch das negative (Fehler) Szenario wie folgt:

%Vor%

// Umwandlung der JSON-Antwort in das GSON-Format

%Vor%

Referenzlinks, die von JSON

in GSON analysiert werden sollen

Ссылка

Ссылка

Ссылка

Ссылка

Ссылка

Hinweis: Um die GSON-Bibliothek in Android zu verwenden.

Fügen Sie folgende Zeilen in Großbuchstaben hinzu:

%Vor%     
Chandru 31.08.2015 05:48
quelle
2

UPDATE ERGEBNIS SCREENSHOTS:

Erfolgsfall: JSONArray

%Vor%

Fehlerfall: JSONObject

%Vor%

Achten Sie in meinem Code auf parseNetworkResponse .

Das Folgende ist meine aktualisierte Antwort, die ich für beide Antworten getestet habe:

%Vor%

Hoffe, das hilft!

    
BNK 31.08.2015 06:24
quelle
1

Sie können den Wert des Codeschlüssels überprüfen, da er Ihnen immer zur Verfügung steht, ob die Antwort ein Fehler oder Erfolg sein würde. Unten ist ein kleiner Ausschnitt:

%Vor%

Hinweis: Eine eher modulare Möglichkeit besteht darin, eine Modellklasse zu erstellen und darin Werte festzulegen. Auf diese Weise erhalten Sie alle Ihre Werte in einem einzigen Java-Objekt.

    
Kaveesh Kanwal 31.08.2015 05:21
quelle
1

Vielleicht können Sie das versuchen:
Verwenden Sie die fastjson-Bibliothek, um Ihre json-Zeichenkette wie folgt in Ihr Java-Objekt in Response.Listener zu konvertieren: Pojo pojo = JSON.parseObject(response.toString(), Pojo.class);

Und dein Pojo mag das mögen:

%Vor%

Dann müssen Sie überprüfen, ob Ihr Pojo einen Wert wie einen Fehler hat. Wenn der Fehler nicht null ist, müssen Sie damit umgehen.
Die fastjson-Bibliothek hilft Ihnen, einen Absturz während der Konvertierung zu vermeiden.

Sie finden fastjson hier

    
uestcfei 11.09.2015 00:20
quelle
0

Verwenden Sie diesen Code:

%Vor%     
Vivek Sinha 17.10.2015 11:31
quelle

Tags und Links