如何编写通用改造响应并能够在反序列化不起作用时记录/调试它?
How to write a generic retrofit response and be able to log / debug it when deserialization does not work?
过去几个小时我一直在努力解决这个问题,我正在寻找指南。
我有一个更新请求,我想以通用方式编写,这意味着我想要一个 JSON 任何类型的东西,比如一袋 属性,然后稍后可以在应用程序中使用它。
我面临的问题是,每当我尝试将其作为 JSON 或字符串(而不是模型或 ResponseBody)获取时,应用程序就会崩溃。我认为逮捕是由于根据我所看到的进行解码。
这是 Retrofit 生成器。
public Retrofit getRetrofit(OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit
.Builder()
.baseUrl("https://reqres.in/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
}
REST 接口超级简单。
public interface IRestService {
@GET("api/users?page=2")
Observable<String> queryPage();
}
我也试过调试这个问题,我添加了我的记录器拦截器,这显然不起作用,我不知道为什么:
public OkHttpClient getOkHttpClient(Interceptor requestInterceptor) {
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
// loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
HttpLoggingInterceptor loggingInterceptor =
new HttpLoggingInterceptor((msg) -> {
Log.d(HttpLoggingInterceptor.class.toString(), msg);
});
//loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
LoggingInterceptor customLoggingInterceptor = new LoggingInterceptor();
return new okhttp3.OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT_IN_MS, TimeUnit.MILLISECONDS)
.addInterceptor(requestInterceptor)
.addInterceptor(loggingInterceptor)
.addInterceptor(customLoggingInterceptor)
.build();
}
如果我在没有模型的情况下以通用形式获取 JSON 有任何错误,请告诉我。
如果我能得到一些关于如何调试此类问题的建议,那也会有很大的帮助,因为记录器没有在 Android Studio 中注册任何内容。
抱歉,如果 none 这些问题很愚蠢,但我刚刚开始在 Android 中构建我的第一个应用程序。我有许多其他语言的经验。
不要在 service
(界面)中为您的 Observable
使用 String
,而是使用 Object
作为类型。并且当你获取数据时,你总是可以使用 Gson().toJson(body.toString())
将其转换为字符串。此外,很可能您的应用程序因 String
而崩溃,因为您没有正确的转换器工厂(标量工厂)。您可以检查 this 是否相同。
过去几个小时我一直在努力解决这个问题,我正在寻找指南。
我有一个更新请求,我想以通用方式编写,这意味着我想要一个 JSON 任何类型的东西,比如一袋 属性,然后稍后可以在应用程序中使用它。
我面临的问题是,每当我尝试将其作为 JSON 或字符串(而不是模型或 ResponseBody)获取时,应用程序就会崩溃。我认为逮捕是由于根据我所看到的进行解码。
这是 Retrofit 生成器。
public Retrofit getRetrofit(OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit
.Builder()
.baseUrl("https://reqres.in/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(MoshiConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
}
REST 接口超级简单。
public interface IRestService {
@GET("api/users?page=2")
Observable<String> queryPage();
}
我也试过调试这个问题,我添加了我的记录器拦截器,这显然不起作用,我不知道为什么:
public OkHttpClient getOkHttpClient(Interceptor requestInterceptor) {
// HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
// loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
HttpLoggingInterceptor loggingInterceptor =
new HttpLoggingInterceptor((msg) -> {
Log.d(HttpLoggingInterceptor.class.toString(), msg);
});
//loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
LoggingInterceptor customLoggingInterceptor = new LoggingInterceptor();
return new okhttp3.OkHttpClient.Builder()
.connectTimeout(CONNECT_TIMEOUT_IN_MS, TimeUnit.MILLISECONDS)
.addInterceptor(requestInterceptor)
.addInterceptor(loggingInterceptor)
.addInterceptor(customLoggingInterceptor)
.build();
}
如果我在没有模型的情况下以通用形式获取 JSON 有任何错误,请告诉我。 如果我能得到一些关于如何调试此类问题的建议,那也会有很大的帮助,因为记录器没有在 Android Studio 中注册任何内容。 抱歉,如果 none 这些问题很愚蠢,但我刚刚开始在 Android 中构建我的第一个应用程序。我有许多其他语言的经验。
不要在 service
(界面)中为您的 Observable
使用 String
,而是使用 Object
作为类型。并且当你获取数据时,你总是可以使用 Gson().toJson(body.toString())
将其转换为字符串。此外,很可能您的应用程序因 String
而崩溃,因为您没有正确的转换器工厂(标量工厂)。您可以检查 this 是否相同。