1. 程式人生 > >retrofit工具增加http調用日誌輸出

retrofit工具增加http調用日誌輸出

client 輸出日誌 查看 默認 cep efault 日常 bst convert

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);
            return
this; }

這個方法可以給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調用日誌輸出