Ich verwende Retrofit 2.0.0-beta1 .
In Tests habe ich ein alternatives Szenario und erwarte Fehler HTTP 400
Ich möchte haben retrofit.Response<MyError> response
aberresponse.body() == null
MyError ist nicht deserialisiert - ich sehe es nur hier
response.errorBody().string()
aber es gibt mir nicht MyError als Objekt
Antworten:
Ich verwende derzeit eine sehr einfache Implementierung, für die keine Konverter oder speziellen Klassen erforderlich sind. Der Code, den ich verwende, ist der folgende:
quelle
ErrorResponse ist Ihr benutzerdefiniertes Antwortobjekt
Kotlin
Java
quelle
gson.fromJson(response.errorBody()?.charStream(), type)
Ich habe es gelöst durch:
MyErrorMessage-Klasse:
quelle
.addConverterFactory(ScalarsConverterFactory.create())
@RonelGonzalesIn Retrofit 2.0 Beta2 erhalte ich auf diese Weise Fehlerantworten:
Synchron
Asynchron
Update für Retrofit 2 Beta3:
Asynchron - Der Retrofit-Parameter wurde aus onResponse entfernt
quelle
List<BasicResponse>
?In https://stackoverflow.com/a/21103420/2914140 und https://futurestud.io/tutorials/retrofit-2-simple-error-handling wird diese Variante für Retrofit 2.1.0 angezeigt.
quelle
quelle
Erstellen Sie ein Modell der Fehlerantwort und des Benutzers Gson, um die Antwort darauf zu konvertieren. Dies wird gut funktionieren.
APIError.java
MainActivity.java (innerhalb der Anfrage onResponse)
quelle
Ich habe es so gemacht für asynchrone Anrufe mit Retrofit 2.0-beta2:
quelle
Wenn Sie Kotlin verwenden, könnte eine andere Lösung darin bestehen, eine Erweiterungsfunktion für die Antwortklasse zu erstellen:
Verwendung
quelle
Es ist eigentlich sehr einfach.
Kotlin:
Java:
Nachrüstung getestet: 2.5.0. Lesen Sie den Text aus dem charStream, der Ihnen einen String gibt, und analysieren Sie ihn dann in JSONObject.
Adios.
quelle
readText()
Erweiterung für Java. VerwendenTextStreamsKt.readText(response.errorBody().charStream())
Sie dieseIch stand vor dem gleichen Problem. Ich habe es mit Nachrüstung gelöst. Lassen Sie mich das zeigen ...
Wenn Ihre Fehler-JSON-Struktur wie folgt ist
Und das ist meine Fehlerstatusklasse
Jetzt brauchen wir eine Klasse, die mit unserem json umgehen kann.
Jetzt können wir unsere Antwort im Nachrüst-API-Aufruf überprüfen
Jetzt können Sie Ihren Toast zeigen
quelle
Auf diese Weise benötigen Sie keine Retrofit-Instanz, wenn Sie nur einen aus Retrofit erstellten Service einfügen.
Verwenden Sie es so:
quelle
Hier ist eine elegante Lösung mit
Kotlin
Erweiterungen:und Verwendung:
showError(retrofitThrowable.getApiError()?.message)
quelle
Dies scheint das Problem zu sein, wenn Sie OkHttp zusammen mit Retrofit verwenden. Sie können also entweder OkHttp entfernen oder den folgenden Code verwenden, um den Fehlerkörper zu erhalten:
quelle
Lesen Sie errorBody in einen String und analysieren Sie json manuell.
quelle
löste es durch:
quelle
JacksonConverterFactory
umGsonConverterFactory
es json in mein benutzerdefiniertes Objekt konvertiert , aber es gibt Warnung Ungeprüfte Guss retrofit.Converter <capture <>>?quelle
In Kotlin:
quelle
errorBody-Werte sollten das APIError-Objekt in Retrofit festlegen. Damit können Sie die folgende Codestruktur verwenden.
quelle
Getestet und funktioniert
quelle
quelle