Ich verwende Retrofit mit GSON und RxJava, um Netzwerkanfragen auszuführen. Ich versuche herauszufinden, wie man die Antwort erhält, wenn die Gson-Bibliothek es nicht konvertiert.Handle Retrofit 2 GSON Konvertierungsfehler
Dies geschieht, wenn ein Fehler auf dem Server auftritt und die Antwort nicht mit der Klasse übereinstimmt, auf die die Gson-Bibliothek die Antwort zu konvertieren versucht.
Eine Arbeit wäre, einen Interzeptor zu erstellen und die Antwort zwischenzuspeichern, bevor wir versuchen, sie zu konvertieren. Aber das ist nur eine schlechte Programmierung, da das Problem nicht mehr bewältigt werden kann, wenn wir gleichzeitig Anfragen stellen.
Der Service ist wie folgt definiert: Die Antwortklasse enthält nur einen Statuscode und einen generischen Typ namens Daten.
Retrofit getService() {
return new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(url)
.client(clientBuilder.build())
.build();
}
public Observable<Response<String>> userLogin(String username, String password) {
return getService().create(Account.class)
.login(username, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
}
Irgendwo anders im Code erstellen wir eine Anfrage
getService().userLogin(email, password)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(onSuccess(), onError());
protected Action1<Response<String>> onSuccess(){
return new Action1<Response<String>>() {
@Override
public void call(Response<String> response) {
// Process the response
}
};
}
protected Action1<Throwable> onError(){
return new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
if (throwable instanceof HttpException) {
ResponseBody body = ((HttpException) throwable).response().errorBody();
// Handle the error
}
}
};
Das Problem tritt auf, wenn der Server etwas anderes als eine Zeichenfolge zurückgibt. Zum Beispiel ein Objekt oder ein Array. Hier wird die GsonConverterFactory einen Fehler werfen, der von der onError-Methode abgefangen wird. Ich frage mich, wie ich eine Antwort bekommen kann.
Das zurückgegebene Throwable ist vom Typ JsonSyntaxException
und enthält leider nicht den ursprünglichen Antworttext, den die GSON-Bibliothek zu konvertieren versucht hat.