2017-06-21 20 views
1

我的问题是关于应该打印出多少OkHttp日志。
在我的应用程序的某些屏幕上,有太多的API调用 - > logcat被淹没,所以我想限制/关闭日志,除了一次性调试如何提供2个Retrofit界面宽度不同的日志级别?

我是新来的匕首2和依赖注入,已经跟在this tutorial之后。

我有工作的下面,但我不知道是否有任何不好的做法存在或是否可以进一步改进:
(大约有20个改造API接口/在我的应用程序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; 

回答

1

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

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

1)使用单一实例的API和OkHttpClient单个实例(无多匕首提供商)

2)具备调试一个拦截,并没有进行生产。这样你就避免了if(Build.DEBUG)逻辑。

3)每个端点

interface YourApi { 

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

4)如果拦截注射(调试版本)添加自定义首部,然后检查在截距法报头,并相应地记录。

@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上。

+0

感谢@RobertEstivill,但你也错过了点:)我不关心包含/排除HTTP头。我关心的是应该打印出多少OkHttp日志。在某些屏幕上,有太多的API调用 - > logcat被泛滥,所以我想限制/关闭日志,除了一次性调试 – ericn

+0

Header用作per/endpoint配置。当然,您也可以将所有请求属性的日志记录行为(例如:路径)。但具有外部配置的属性是更明显的选项。如果您需要在运行时更改行为,那么您将不得不坚持HttpLogginInterceptor实例并修改它的状态,以便在调用之间表现不同 –

相关问题