Retrofit 2.0 + OkHttp 3.0 配置
來自: 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 轉換器
未完待續,俺先去吃飯…