Benutzerdefinierte Fehlerbehandlung mit Retrofit

8

Die REST-API, mit der ich arbeite, hat benutzerdefinierte Codes und Nachrichten, die vom Server gesendet werden, abhängig vom Status. Ich möchte ein benutzerdefiniertes Callback<T> implementieren, das die success -Methode nur aufruft, wenn der Statuscode 0 ist .

Beispiel SUCCESS Antwort vom Server erhalten:

%Vor%

Beispiel für FAILURE Response:

%Vor%

code und message werden von allen Anfragen zurückgegeben, die data enthält die tatsächlichen Antwortwerte, daher möchte ich Folgendes tun:

  1. Überprüfen Sie den Code und die Nachricht und rufen Sie success() nur dann auf, wenn der Code 0 ist.
  2. Rufen Sie failure() auf, wenn die Anfrage fehlgeschlagen ist, oder code! = 0
  3. Erstellen Sie benutzerdefinierte Objekte basierend auf der Daten -Antwort und übergeben Sie sie über success() .

Was ist der beste Weg, dies zu tun? Ich suchte überall und konnte keine gute Lösung finden. Der einzige, den ich bekam, war, alle benutzerdefinierten Objekte die code und message Felder zu haben und ihre Werte in success() zu überprüfen, aber dies könnte in Zukunft Probleme verursachen, falls jemand vergisst, die code zu überprüfen, bevor er fortfährt .

    
Nima 25.09.2014, 16:30
quelle

5 Antworten

3

Sie können das tun schnell durch nur eine abstrakte Klasse zu machen, die Callback implementiert, und Ihre eigenen abstrakten Erfolg und Misserfolg Methoden erklären. Die abstrakte Klasse wird Retrofit Standardcallback-Methoden verarbeitet, interpretiert die Antwort und ruft die abstrakten Methoden entsprechend.

Ich denke, ein weiterer möglicher Ansatz dazu ist Retrofit-Client-Schnittstelle außer Kraft zu setzen Sie Ihr eigenes Response-Objekt zu bauen.

Wenn Sie erweitern OkClient , es kann so gehen:

%Vor%

Dies kann mehr Arbeit als der Fall in Callback-Handling, aber ich denke, es ist, wenn irgendwann die API-Übergänge zu RESTful API Konventionen helfen kann.

Diese Lösung hat jedoch ein eigenes Problem, da die JSON-Konvertierung zweimal ausgeführt wird. Eine in Ihrem Kunden und eine weitere in Retrofit. Ich bin mir nicht sicher, wie das im Moment richtig funktioniert. Wahrscheinlich etwas um TypedInput und einen Dummy-Konverter, der bereits konvertierte Objekte übergibt.

    
Hassan Ibraheem 29.09.2014 08:01
quelle
1

Erstellen Sie einen benutzerdefinierten ResponseBodyConverter wie folgt:

%Vor%     
Neo lee 28.01.2016 08:34
quelle
0

Damit kommst du wenigstens los. Sie können im Grunde Ihren eigenen benutzerdefinierten Rückruf erstellen und dann den Erfolg behandeln. Schau dir an, was gesendet wurde und was du tun musst.

%Vor%     
Kalel Wade 25.09.2014 16:45
quelle
0

In Ihrem Fall können Sie eine Klasse haben, die Ihre json-Antwort abbildet:

%Vor%

Da Sie zurück in der Welt der Java-Objekte sind, können Sie ein Factory-ähnliches Objekt in Ihrem Erfolgsmethoden-Callback haben, das das gewünschte Objekt basierend auf der zurückgegebenen benutzerdefinierten Antwort erstellt. Wenn Sie diese Antwort in dem Fehlerrückruf erhalten möchten, würde ich Retrofit verwenden, da Ihre API einem guten Restentwurf nicht folgt.

Obwohl dies möglich ist und Sie verstehen, dass Sie möglicherweise nicht an der API-Entwicklung beteiligt sind, sollten Sie sich bewusst sein, dass dies kein guter API-Designansatz ist. Wenn Sie eine Anmeldeanforderung an den Server senden, können Sie diese Anforderung als Anforderung zum Erstellen einer Ressource (z. B. einer authentifizierten Benutzersitzung) verstehen. Wenn Sie nicht die richtigen Parameter (in diesem Fall den richtigen Benutzernamen und das richtige Passwort) senden, sollte der Server die Anforderung zur Ressourcenerstellung ablehnen und einen 4-Sterne-Statuscode (4xx) zurücksenden, der angibt, dass Ihre Anfrage nicht korrekt war irgendwie. Retrofit würde diesen 4xx-Statuscode verstehen und Ihren Fehlerrückruf aufrufen, wo Sie die Antwort entsprechend behandeln könnten.

    
rafaelportela 30.11.2014 14:10
quelle
0

Es ist eine bessere Idee, einen benutzerdefinierten Rückruf zu implementieren. Sie können unten ein Beispiel dazu finden.

%Vor%

Geben Sie Ihrem Call-Back-Service einen Rückruf zu Ihrer Retrofit-Service-Interface-Methode.

%Vor%

Viel Glück.

    
savepopulation 28.01.2016 09:01
quelle

Tags und Links