gpt4 book ai didi

android - 如何提供 2 个 Retrofit 接口(interface)宽度不同的日志记录级别?

转载 作者:行者123 更新时间:2023-11-30 00:29:41 37 4
gpt4 key购买 nike

我关心的是应该打印多少OkHttp日志。
在我的应用程序的某些屏幕上,有太多的 API 调用 --> logcat 被淹没所以我想限制/关闭那里的日志记录,除了一次性调试

我是 Dagger 2 和依赖注入(inject)的新手,一直在关注 this tutorial .

我有以下有效的方法,但我不确定那里是否有任何不好的做法,或者是否可以进一步改进:
(我的应用程序中大约有 20 个 Retrofit API 接口(interface)/20 个不同的端点)

@Module
public class NetModule {

private String mBaseUrl;
private final HttpLoggingInterceptor LOGGING_FULL = new HttpLoggingInterceptor().setLevel
(HttpLoggingInterceptor
.Level.BODY);
private final HttpLoggingInterceptor LOGGING_HEADERS = new HttpLoggingInterceptor().setLevel
(HttpLoggingInterceptor
.Level.HEADERS);

// Constructor needs one parameter to instantiate.
public NetModule(String baseUrl) {
this.mBaseUrl = baseUrl;
}

@Provides
@Singleton
OkHttpClient.Builder provideOkHttpClientBuilder() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//...
return builder;
}

@Provides
@Singleton
Retrofit.Builder provideRetrofitBuilder() {
return new Retrofit.Builder()
.baseUrl(mBaseUrl);
}

@Provides
@Singleton
Api1 provideApi1(OkHttpClient.Builder okHttpClientBuilder, Retrofit.Builder retrofitBuilder) {
if (BuildConfig.DEBUG || !BuildConfig.FLAVOR.equals(FLAVOUR_PRODUCTION)) {
okHttpClientBuilder.addInterceptor(LOGGING_HEADERS);
}
return retrofitBuilder.client(okHttpClientBuilder.build()).build().create(Api1.class);
}
@Provides
@Named("logging_full")
@Singleton
Api1 provideApi1FullLog(OkHttpClient.Builder okHttpClientBuilder, Retrofit.Builder retrofitBuilder) {
if (BuildConfig.DEBUG || !BuildConfig.FLAVOR.equals(FLAVOUR_PRODUCTION)) {
okHttpClientBuilder.addInterceptor(LOGGING_FULL);
}
return retrofitBuilder.client(okHttpClientBuilder.build()).build().create(Api1.class);
}
//... Repeats for Api2, Api3, ..., Api20

}

用法:
1) 在大多数情况下,不需要记录主体,因此:

@Inject
Api1 api1;

2) 在某些情况下,需要记录正文:

@Inject
@Named("logging_full")
Api1 api2;

最佳答案

我认为这是一个过度设计的解决方案。如果您在 http 拦截器层需要不同的行为,则不必处理不同的 Api、httpclients 或其他任何实例。

这将是我解决您问题的第一种方法。

1) 为 Api 使用单个实例,为 OkHttpClient 使用单个实例(没有多个 Dagger 提供者)

2) 有一个用于调试的拦截器,没有一个用于生产。这样您就可以避免 if( Build.DEBUG ) 逻辑。

3) 为每个端点添加自定义 header

   interface YourApi {

@Headers("YourCustomLoggingHeader: HEADERS")
@GET("/your_path")
ReturnType yourApiMethod( ParamType p);
}

4) 如果拦截器被注入(inject)(调试构建),则检查拦截方法中的 header 并相应地记录。

    @Override public Response intercept(Chain chain) throws IOException {

String headerValue = chain.request().headers().get("YourCustomLoggingHeader");

if( TextUtils.isEmpty(headervalue)){
return = chain.proceed(request);
}

// TODO remove header for real request

switch( headerValue ){
case "HEADERS":
//TODO log headers
break;
case "BODY":
//TODO log body
break;
}
}

这是伪代码,因为我不在 IDE 上。

关于android - 如何提供 2 个 Retrofit 接口(interface)宽度不同的日志记录级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44669526/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com