Retrofit 2.0 + OkHttp 3.0 配置

Corrine5136 8年前發布 | 110K 次閱讀 Retrofit OkHttp Android開發 移動開發

來自: http://drakeet.me/retrofit-2-0-okhttp-3-0-config

Retrofit 和 OkHttp 都是偉大的 Square 公司開源的偉大項目。我從 2014 年便在同事 ionull 的推薦帶領下,使用這個網絡庫組合以及 RxJava,真是極大改善 Android 開發體驗的好東西。前段時間也是從 Retrofit 1.9 升級到 2.0 beta 4 版本,從 OkHttp 2.+ 版本升級到  3.0.1 版本。這兩者在各自的這兩個大版本升級中,都改變了不少,使得原本的代碼都需要進行一些修改才能使用,我也是稍微摸索了幾下,如今大致摸清,把一些基礎配置,比如設置 Json 轉換器、Rx Java 適配器、設置 Debug Log 模式、設置超時、錯誤重連,以及配置 Access token Interceptor 等等一些內容,分享一下。

引入依賴:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'
compile 'com.squareup.okhttp3:okhttp:3.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.0.1'

先說 OkHttp 3.0 的配置,3.0 使用層面上的主要改變是,由原本的 okHttp 對象直接各種 set 進行配置改為 Builder 配置模式,所以原本對應的方法應該到 OkHttpClient.Builder 類對象下尋找。我的一些常用配置如下:

HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(interceptor)
        .retryOnConnectionFailure(true)
        .connectTimeout(15, TimeUnit.SECONDS)
        .addNetworkInterceptor(mTokenInterceptor)
        .build();

解釋:

  • HttpLoggingInterceptor 是一個攔截器,用于輸出網絡請求和結果的 Log,可以配置 level 為 BASIC / HEADERS / BODY,都很好理解,對應的是原來 retrofit 的 set log level 方法,現在 retrofit 已經沒有這個方法了,所以只能到 OkHttp 這邊來配置,并且 BODY 對應原來到 FULL.
  • retryOnConnectionFailure 方法為設置出現錯誤進行重新連接。
  • connectTimeout 設置超時時間
  • addNetworkInterceptor 讓所有網絡請求都附上你的攔截器,我這里設置了一個 token 攔截器,就是在所有網絡請求的 header 加上 token 參數,下面會稍微講一下這個內容。

讓所有網絡請求都附上你的攔截器:

Interceptor mTokenInterceptor = new Interceptor() {
    @Override public Response intercept(Chain chain) throws IOException {
        Request originalRequest = chain.request();
        if (Your.sToken == null || alreadyHasAuthorizationHeader(originalRequest)) {
            return chain.proceed(originalRequest);
        }
        Request authorised = originalRequest.newBuilder()
            .header("Authorization", Your.sToken)
            .build();
        return chain.proceed(authorised);
    }
};

解釋:

  • 那個 if 判斷意思是,如果你的 token 是空的,就是還沒有請求到 token,比如對于登陸請求,是沒有 token 的,只有等到登陸之后才有 token,這時候就不進行附著上 token。另外,如果你的請求中已經帶有驗證 header 了,比如你手動設置了一個另外的 token,那么也不需要再附著這一個 token.
  • header 的 key 通常是 Authorization,如果你的不是這個,可以修改。

如果你需要在遇到諸如 401 Not Authorised 的時候進行刷新 token,可以使用 Authenticator,這是一個專門設計用于當驗證出現錯誤的時候,進行詢問獲取處理的攔截器:

Authenticator mAuthenticator = new Authenticator() {
    @Override public Request authenticate(Route route, Response response)
            throws IOException {
        Your.sToken = service.refreshToken();
        return response.request().newBuilder()
                       .addHeader("Authorization", newAccessToken)
                       .build();        
    }
}

然后,對于以上的兩個攔截器,分別使用 OkHttpClient.Builder 對象的 addNetworkInterceptor(mTokenInterceptor) 和 authenticator(mAuthenticator) 即可。

Retrofit:

對于 Retrofit,我的配置是:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(AppConfig.BASE_URL)
        .client(client)
        .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();
service = retrofit.create(YourApi.class);

解釋:

  • baseUrl: 原來的 setEndPoint 方法變成了 baseUrl
  • client 即上面的 OkHttp3 對象
  • addCallAdapterFactory 增加 RxJava 適配器
  • addConverterFactory 增加 Gson 轉換器

未完待續,俺先去吃飯…

 本文由用戶 Corrine5136 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!