retrofit2.0使用攔截器Interceptor統(tǒng)一打印請求與響應(yīng)的json

開始之前先甩上retrofit和okhttp的github鏈接:
https://github.com/square/retrofit
https://github.com/square/okhttp

大家都知道一款A(yù)PP里請求很多纷捞,如果能統(tǒng)一打印請求與響應(yīng)的json自然十分方便凰盔。retrofit作為知名網(wǎng)絡(luò)請求框架昧港,提供了攔截器Interceptor褪子,官方對攔截器的定義:

Interceptors area powerful mechanism that can monitor, rewrite, and retry calls.
攔截器可以用來轉(zhuǎn)換,重試排龄,重寫請求的機制爽柒。

我們就不轉(zhuǎn)換重寫了,只是打印一下就好率挣。


先添加依賴:

compile 'com.squareup.retrofit2:retrofit:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.google.code.gson:gson:2.6.1'
compile 'com.squareup.okhttp3:okhttp:3.1.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
compile 'com.orhanobut:logger:2.1.0' // 打印日志

其實okhttp已經(jīng)為我們提供了一個Interceptor的實現(xiàn)類:HttpLoggingInterceptor。只要稍作設(shè)置就可以:

    HttpLoggingInterceptor logInterceptor = new HttpLoggingInterceptor();
    if(BuildConfig.DEBUG){
        //顯示日志
        logInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    }else {
        logInterceptor.setLevel(HttpLoggingInterceptor.Level.NONE);
    }
    okHttpClient.addInterceptor(logInterceptor);

這樣請求和響應(yīng)的日志就都會打印出來啦~
但是有些手機比如聯(lián)想可能會默認(rèn)屏蔽這樣的日志(之前我就是用聯(lián)想手機測試露戒,還以為這方法不管用)椒功,可以在手機上設(shè)置使其顯示。不同的機器設(shè)置方式不一樣智什,搜索一下都有~

如果不想設(shè)置或者想自己定義一下打印的格式动漾,可以像下面這樣寫:

public class LoggingInterceptor implements Interceptor {
  private final Charset UTF8 = Charset.forName("UTF-8");

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

    Request request = chain.request();
    RequestBody requestBody = request.body();

    String body = null;

    if(requestBody != null) {
        Buffer buffer = new Buffer();
        requestBody.writeTo(buffer);

        Charset charset = UTF8;
        MediaType contentType = requestBody.contentType();
        if (contentType != null) {
            charset = contentType.charset(UTF8);
        }
        body = buffer.readString(charset);
    }

    Logger.e("發(fā)送請求\nmethod:%s\nurl:%s\nheaders: %sbody:%s",
            request.method(), request.url(), request.headers(), body);

    long startNs = System.nanoTime();
    Response response = chain.proceed(request);
    long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);

    ResponseBody responseBody = response.body();
    String rBody = null;

    if(HttpEngine.hasBody(response)) {
        BufferedSource source = responseBody.source();
        source.request(Long.MAX_VALUE); // Buffer the entire body.
        Buffer buffer = source.buffer();

        Charset charset = UTF8;
        MediaType contentType = responseBody.contentType();
        if (contentType != null) {
            try {
                charset = contentType.charset(UTF8);
            } catch (UnsupportedCharsetException e) {
                e.printStackTrace();
            }
        }
        rBody = buffer.clone().readString(charset);
    }

    Logger.e("收到響應(yīng) %s%s %ss\n請求url:%s\n請求body:%s\n響應(yīng)body:%s",
            response.code(), response.message(), tookMs, response.request().url(), body, rBody);

    return response;
  }
}

在OkHttpClient中添加攔截:

    OkHttpClient.Builder client = new OkHttpClient.Builder()
            .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)//設(shè)置超時時間
            .retryOnConnectionFailure(true);

    //添加攔截
    if (BuildConfig.DEBUG) {
        client.addInterceptor(new LoggingInterceptor())
    }

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API)
            .client(client.build())
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();

看一些博客里的文章,好像直接通過下面的代碼就可以攔截響應(yīng)撩鹿,但是我這么寫了并沒有看到有日志輸出...除非像上面那樣重寫HttpLoggingInterceptor.Logger的log()方法谦炬,難道是其實打印了我沒找到?......有知道的小伙伴告知一下
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient httpClient = new OkHttpClient.Builder().addInterceptor(logging).build();
----------------------------------------------2017-07-25----------------------------------------------
還真是其實打印了我沒找到节沦,見開頭键思。

參考:
Android Retrofit2.0查看log和JSON字符串(HttpLoggingInterceptor)
OkHttp使用(四)攔截器
https://github.com/jaydenxiao2016/AndroidFire
這里還有一篇:
HttpLoggingInterceptor攔截的log信息為unicode字符時的解決辦法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市甫贯,隨后出現(xiàn)的幾起案子吼鳞,更是在濱河造成了極大的恐慌,老刑警劉巖叫搁,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赔桌,死亡現(xiàn)場離奇詭異,居然都是意外死亡渴逻,警方通過查閱死者的電腦和手機疾党,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惨奕,“玉大人雪位,你說我怎么就攤上這事±孀玻” “怎么了雹洗?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卧波。 經(jīng)常有香客問我时肿,道長,這世上最難降的妖魔是什么港粱? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任螃成,我火速辦了婚禮,結(jié)果婚禮上查坪,老公的妹妹穿的比我還像新娘锈颗。我一直安慰自己,他們只是感情好咪惠,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布击吱。 她就那樣靜靜地躺著,像睡著了一般遥昧。 火紅的嫁衣襯著肌膚如雪覆醇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天炭臭,我揣著相機與錄音永脓,去河邊找鬼。 笑死鞋仍,一個胖子當(dāng)著我的面吹牛常摧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼落午,長吁一口氣:“原來是場噩夢啊……” “哼谎懦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溃斋,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤界拦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后梗劫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體享甸,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年梳侨,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛉威。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡走哺,死狀恐怖蚯嫌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情割坠,我是刑警寧澤齐帚,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站彼哼,受9級特大地震影響对妄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敢朱,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一剪菱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拴签,春花似錦孝常、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岸梨,卻和暖如春喜颁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曹阔。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工半开, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赃份。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓寂拆,卻偏偏與公主長得像奢米,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纠永,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容