原文連接:Tips on updating to Retrofit 2
ps:其實我老早就更新到Retrofit2了 可是不一樣的beta版目前改變仍是挺大的,若是你在用的話 ,要時刻跟進並查看它的changelog.該文章仍是比較傾向於1.9升級2.0 可是就像前面說的 beta2到beta4改變也是很是大的 因此一樣能夠參考用於備忘java
Retrofit2.0已經公開發布幾個月了,可是如今依然是beta版,一些開發者已經開始從以前的版本進行升級,雖然官方已經提供了文檔,文章或博客讓你瞭解最新版的相關信息,可是在StackOverflow仍是能夠看到一些提問關於在升級版本的過程當中怎麼處理常見功能像logging打印日誌,添加request parameter或者使用JSON對象等,因此在這篇文章中,我會告訴你關於這些問題的一些技巧。git
寫文章時,Retrofit的版本是v2.0.0-beta4.github
第一個你會注意到的改變是新的group id,變成了com.squareup.retrofit2,因此新的依賴聲明是:api
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
主包名已經改爲了網絡
package retrofit2;
這意味的你須要更改全部關於Retrofit的import,此外,若是你還有其餘涉及到包名的代碼或任務,記得也要更新他們。maven
由於新包名,若是你開啓了混淆代碼,第一件要作的事就是更新配置文件的規則,它們能夠在官方網站找到:ide
-dontwarn retrofit2.** -keep class retrofit2.** { *; } -keepattributes Signature -keepattributes Exceptions
okhttp如今Retrofit2內置的默認依賴,實際上,查看Retrofit2的pom文件(maven的依賴配置文件),會發現下面的依賴:網站
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency>
若是你不須要用一個特殊版本的okhttp或者其餘http client,你不用作任何事情。ui
service interface implementation generationurl
你會當即注意到的另一件事是你的生成服務接口實現的代碼無法編譯了。
下面是Retrofit的典型代碼:
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build(); GitHubService service = restAdapter.create(GitHubService.class);
在Retrofit2,會變成:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .build(); GitHubService service = retrofit.create(GitHubService.class);
你能夠看到,依然是build模式,可是涉及的方法和類已經變了。
在開發中打印網絡請求和返回結果是很是重要的,若是你在Retrofit中啓用了這個功能,你會發現實現該功能的方法已經不可用了。
setLogLevel(RestAdapter.LogLevel.FULL)
那是由於你如今必須依靠okhttp提供的日誌系統,HttpLoggingInterceptor.
首先聲明一個新的依賴,由於它不是okhttp的一部分因此要另外添加依賴:
compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'
而後,建立一個interceptor實例:
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
再而後,添加到OkHttp client實例中:
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();
最後,把client設置到service interface實現中:
Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(MovieDbApi.END_POINT) .build(); movieDbApi = retrofit.create(MovieDbApi.class);
ps:其實這個log並非很好用,最好本身參考源碼本身自定義一個,分分鐘就搞定了。
By default, Retrofit can only deserialize HTTP bodies into OkHttp’s ResponseBody type and it can only accept its RequestBodytype for @Body.
這意味得用來支持其餘types的converter必須在建立服務接口時進行設置
爲了讓JSON和Java對象相互轉換,咱們須要設置一個GSON轉換器
首先,須要一個新的依賴:
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
而後設置converter factory:
Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(MovieDbApi.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .build(); movieDbApi = retrofit.create(MovieDbApi.class);
完整的可用converters能夠查看官方文檔
Retrofit另一個有用的功能是能夠攔截http請求進行監控,重寫或重試
一個典型應用場景是全部http請求須要加上api key,在Retrofit2以前,能夠經過RequestInterceptor實現:
final RequestInterceptor authorizationInterceptor = new RequestInterceptor() { @Override public void intercept(RequestInterceptor.RequestFacade request) { request.addQueryParam(MovieDbApi.PARAM_API_KEY, "YOUR_API_KEY"); } };
而後
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(MovieDbApi.END_POINT) .setRequestInterceptor(authorizationInterceptor) .build(); movieDbApi = restAdapter.create(MovieDbApi.class);
在Retrofit2中已經再也不有效了,由於你如今必須依靠OKHttp interceptors.
你能夠直接在OKHttp client實例化時進行設置:
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl url = request.url().newBuilder().addQueryParameter( MovieDbApi.PARAM_API_KEY, BuildConfig.MOVIE_DB_API_KEY).build(); request = request.newBuilder().url(url).build(); return chain.proceed(request); } }).build();
而後像前面那樣設置client:
Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(MovieDbApi.END_POINT) .build(); movieDbApi = retrofit.create(MovieDbApi.class);
若是你正在使用RxJava,你會注意到Retrofit2 interfaces已經不支持Observable了,實際上,Call模式被用於標準的http請求。
固然你能夠用你本身的類型,提供你本身的CallAdapter實現,可是幸運的是已經有可用的了,RxJavaCallAdapterFactory.簡單說,它把Call轉換成Observable.
首先,添加依賴:
com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4
而後,用addCallAdapterFactory進行設置:
Retrofit retrofit = new Retrofit.Builder() .client(okHttpClient) .baseUrl(MovieDbApi.END_POINT) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); movieDbApi = retrofit.create(MovieDbApi.class);