简单介绍
retrofit2.0相对retrofit1.0修改了大量api,使用方法有不少变动,我将目前所接触到的针对retrofit2.0的资料进行整理和归类。
参考文章:用 Retrofit 2 简化 HTTP 请求, 更新到Retrofit2的一些技巧
参考demo:RxJava 和 Retrofit 结合使用的几个最常见使用方式举例
接下来重点说下2.0相对1.0常用的改动,总结起来如下六点
1. 2.0必须手动设置转换器,1.0如果不设置会启动默认的gson转化器工厂。
@GET("/repos/{owner}/{repo}/contributors")
ContributorResponse repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
}
builder.setConverter(new ProtoConverter());
builder.setConverter(new WireConverter());
builder.setConverter(new SimpleXMLConverter());
builder.setConverter(new CustomConverter());
2.我们在某些场景下既需要异步的调用,又需要同步的调用。在 Retrofit 1.0 里,你必须得声明两次这个方法,像下面这样:
interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
List<Contributor> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
@GET("/repos/{owner}/{repo}/contributors")
void repoContributors(
@Path("owner") String owner,
@Path("repo") String repo,
Callback<List<Contributor>> cb);
}
在2.0中只需要声明一次即可,同步使用clone:
Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit");
response = call.execute();
// This will throw IllegalStateException:
response = call.execute();
Call<List<Contributor>> call2 = call.clone();
// This will not throw:
response = call2.execute();
异步,需要调用 enqueue 方法:
Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit");
call.enqueue(new Callback<List<Contributor>>() {
@Override void onResponse(/* ... */) {
// ...
}
@Override void onFailure(Throwable t) {
// ...
}
});
当你将一些异步请求压入队列后,甚至你在执行同步请求的时候,你可以随时调用 cancel 方法来取消请求:
Call<List<Contributor>> call =
gitHubService.repoContributors("square", "retrofit");
call.enqueue( );
// or...
call.execute();
// later...
call.cancel();
3.新增@Url标注,允许你直接传入一个请求的 URL。
interface GitHubService {
@GET("/repos/{owner}/{repo}/contributors")
Call<List<Contributor>> repoContributors(
@Path("owner") String owner,
@Path("repo") String repo);
@GET
Call<List<Contributor>> repoContributorsPaginate(
@Url String url);
}
在repoContributorsPaginate方法中,可以直接传入url即可,@GET不用必须指定action,可以动态的填写。
4. Retrofit 2 现在开始依赖了 OkHttp 了,而且这部分不再支持替换。
5. 目前2.0以及2.1版本不支持日志模式了,需要依靠okhttp提供的日志系统,HttpLoggingInterceptor.使用方法:
先导入:
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);
6. interceptor拦截器使用方法变更。在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);