如何只在Retrofit响应成功时添加GSON CallAdapter Factory
How to Add GSON CallAdapterFactory only when Retrofit Response is Succesfull
我有一个 REST 服务器,我的问题是每当我的响应不成功时,我想从响应正文中解析错误并将其显示给用户(将错误信息传递给调用 Activity)
@Named("rest_api")
@Singleton
@Provides
Interceptor provideRESTInterceptor(final UserManager userManager) {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
String token = userManager.getJwt();
Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Authorization", "Bearer "+token)
.method(original.method(), original.body())
.build();
Log.i(LOG_TAG, "REQUEST URL "+request.uri());
Response response = chain.proceed(request);
if(!response.isSuccessful()) {
// How do i send this error to my Activity.
APIError apiError = new APIError(response.code(),response.body().string());
}
// Customize or return the response
return response;
}
};
}
我正在使用 RxJavaConverter
@Named("rest_api")
@Singleton
@Provides
Retrofit provideRESTRetrofit(@Named("rest_api")OkHttpClient client, Converter.Factory converter, CallAdapter.Factory rxJava) {
return new Retrofit.Builder()
.baseUrl(PUBLIC_PRODUCTION_URL)
.client(client)
.addCallAdapterFactory(rxJava)
.addConverterFactory(converter)
.build();
}
自 Retrofit 2.0 以来,即使响应不成功,它也会尝试将具有给定 GSON 的数据转换为 (POJO),从而引发错误,而我丢失了错误的实际消息。
正如@david:mihola 所建议的那样,使用 Retrofit Response 对象我能够实现这一目标。
Response<MyObject> response;
if(response.isSucessful) {
MyObject obj = response.body();
} else {
// You can process your error message from the reponse
}
它真的让我免于大量手动 GSON 解析
我有一个 REST 服务器,我的问题是每当我的响应不成功时,我想从响应正文中解析错误并将其显示给用户(将错误信息传递给调用 Activity)
@Named("rest_api")
@Singleton
@Provides
Interceptor provideRESTInterceptor(final UserManager userManager) {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
String token = userManager.getJwt();
Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Authorization", "Bearer "+token)
.method(original.method(), original.body())
.build();
Log.i(LOG_TAG, "REQUEST URL "+request.uri());
Response response = chain.proceed(request);
if(!response.isSuccessful()) {
// How do i send this error to my Activity.
APIError apiError = new APIError(response.code(),response.body().string());
}
// Customize or return the response
return response;
}
};
}
我正在使用 RxJavaConverter
@Named("rest_api")
@Singleton
@Provides
Retrofit provideRESTRetrofit(@Named("rest_api")OkHttpClient client, Converter.Factory converter, CallAdapter.Factory rxJava) {
return new Retrofit.Builder()
.baseUrl(PUBLIC_PRODUCTION_URL)
.client(client)
.addCallAdapterFactory(rxJava)
.addConverterFactory(converter)
.build();
}
自 Retrofit 2.0 以来,即使响应不成功,它也会尝试将具有给定 GSON 的数据转换为 (POJO),从而引发错误,而我丢失了错误的实际消息。
正如@david:mihola 所建议的那样,使用 Retrofit Response 对象我能够实现这一目标。
Response<MyObject> response;
if(response.isSucessful) {
MyObject obj = response.body();
} else {
// You can process your error message from the reponse
}
它真的让我免于大量手动 GSON 解析