retrofit工具增加http調用日誌輸出
Retrofit 是一個很好用的http調用組件。內置的其實也是okhttp。把okhttp封裝了一下,讓日常的業務交互對http調用的感知變小。
一個http調用只需要一行代碼就可以了。具體的Retrofit的用法不在這裏闡述。自行百度。
這裏只講解如何讓Retrofit能夠打印http調用的相關參數日誌。開講:
Retrofit每次調用的時候都會用到OKhttpcilent這個客戶端,它默認的client是沒有打印日誌功能的,查看Retrofit的源碼:
public final class Retrofit { public static final class Builder {public Builder client(OkHttpClient client) { return callFactory((okhttp3.Call.Factory)Utils.checkNotNull(client, "client == null")); } public Builder callFactory(okhttp3.Call.Factory factory) { callFactory = (okhttp3.Call.Factory)Utils.checkNotNull(factory, "factory == null");return this; }
可以看到這裏是支持傳入自定義的OKhttpclient的,所以我們就構建一個可以打印日誌的OKhttpclient傳進去,然後讓每次Retrofit的調用都可以打印日誌。
那麽如何構建可以打印日誌的OKhttpclient呢?我們來查看OKhttpclient的源碼,可以找到如下方法:
public Builder addInterceptor(Interceptor interceptor) { interceptors.add(interceptor); returnthis; }
這個方法可以給client添加各種各樣的攔截器,然後達到自己的一些需求。我們要在這裏添加一個日誌的攔截器,然後每次client的一些http步驟的調用都會調用這個攔截器來做日誌輸出。
日誌的攔截器需要引入jar包(這個jar包只有一個HttpLoggingInterceptor類。。。搞不懂為什麽不直接放到okhttp包裏。):
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>logging-interceptor</artifactId> <version>3.1.2</version> </dependency>
然後我們創建一個自己的HttpLoggingInterceptor放到自定義的client中,然後設置到Retrofit中。這樣我們的Retrofit就可以打印日誌了。具體的實現代碼如下:
初始化Retrofit並設置可以打印日誌的OKhttpclient:
/** * 調用第三方服務 * * @param baseURL * @param service * @return */ public static <T> T start(String baseURL, Class<T> service) { HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build(); return new Retrofit.Builder().baseUrl(baseURL).client(client).addConverterFactory(GsonConverterFactory.create()).build().create(service); }
這樣設置之後我們就可以打印Retrofit的http調用日誌了。 代碼中有一個 HttpLoggingInterceptor.Level 的枚舉。這裏是設置要打印的日誌的內容的。簡單介紹下:
HttpLoggingInterceptor.Level.NONE 不打印,
HttpLoggingInterceptor.Level.BASIC 請求和響應,
HttpLoggingInterceptor.Level.HEADERS 請求和響應+頭,
HttpLoggingInterceptor.Level.BODY 請求和響應+頭+體,
大家可以根據自己的需要來打印。
這樣設置之後再本地啟動調試的時候是可以在控制臺上看到日誌的。但是如果log日誌是要輸出到日誌文件的時候就不好使了。 因為攔截器默認的是輸出到控制臺。
那麽如何解決這個問題?我們來看HttpLoggingInterceptor的源碼:
public final class HttpLoggingInterceptor implements Interceptor { public static interface Logger { public abstract void log(String s); public static final Logger DEFAULT = new Logger() { public void log(String message) { Platform.get().log(message); } }; }
這裏有個輸出日誌的接口的實現類, 我們可以實現HttpLoggingInterceptor.Logger接口,然後重寫它的log方法,來用自己的log輸出工具來輸出。這樣就可以解決這個問題。具體如何重寫。。。
連重寫都不會還寫什麽java代碼。。。。
retrofit工具增加http調用日誌輸出