如何编写通用改造响应并能够在反序列化不起作用时记录/调试它?

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 是否相同。