Я использую модификацию с помощью GSON и RxJava для выполнения сетевых запросов. Я пытаюсь понять, как получить ответ, когда библиотека Gson не сможет его преобразовать.Ручка модификации 2 ошибки преобразования GSON
Это происходит, когда на сервере происходит ошибка, и ответ не соответствует классу, который библиотека Gson пытается преобразовать.
Работа должна заключаться в создании перехватчика и кэшировании ответа, прежде чем мы попытаемся его преобразовать. Но это просто плохое программирование, так как проблема станет неуправляемой, как только мы начнем выполнять параллельные запросы.
сервис определяется следующим образом. Класс ответа содержит только код состояния и общий тип, называемый данными.
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());
}
Где-то в коде мы создаем запрос
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
}
}
};
Проблема возникает, когда сервер возвращает нечто иное, чем строка. Например, объект или массив. Здесь GsonConverterFactory выдает ошибку, которая будет обнаружена методом onError. Мне интересно, как я могу получить ответ.
Возвращаемое значение, которое возвращается, имеет тип JsonSyntaxException
и, к сожалению, оно не содержит оригинальное тело ответа, которое библиотека GSON пыталась преобразовать.