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

问题描述 投票:0回答:1

在过去的几个小时里我一直在努力解决这个问题,我找了一个指南。

我有一个更新请求,我想以通用方式编写,这意味着我想获得任何类型的JSON,如一袋属性,并能够在以后的应用程序中使用它。

我面临的问题是,每当我尝试将其作为JSON或String(而不是模型或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中注册任何东西。很抱歉,如果这些问题都不是愚蠢的,但我刚刚开始在Android中构建我的第一个应用程序。我有很多其他语言的经验。

android retrofit retrofit2 okhttp3
1个回答
1
投票

不要在String(界面)中使用Observable作为service,而是使用Object作为类型。当你获得数据时,你总是可以使用Gson().toJson(body.toString())将其转换为字符串。此外,很可能你的应用程序崩溃String因为你没有正确的转换器工厂(标量工厂)。你可以检查this相同。

© www.soinside.com 2019 - 2024. All rights reserved.