最近事比较多,距离上次写文章已经过去了一个月了。上一篇文章Retrofit全攻略——基础篇 介绍了Retrofit的基础用法,这篇文章介绍点进阶的用法。
打印网络日志
在开发阶段,为了方便调试,我们需要查看网络日志。因为Retrofit2.0+
底层是采用的OKHttp
请求的。可以给OKHttp设置拦截器,用来打印日志。
首先可以在app/build.gradle
中添加依赖,这是官方的日志拦截器。
compile 'com.squareup.okhttp3:logging-interceptor:3.3.0'
然后在代码中设置:
public static Retrofit getRetrofit() {
//如果mRetrofit为空 或者服务器地址改变 重新创建
if (mRetrofit == null) {
OkHttpClient httpClient;
OkHttpClient.Builder builder=new OkHttpClient.Builder();
//阶段分为开发和发布阶段,当前为开发阶段设置拦截器
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
//设置拦截器级别
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
}
httpClient=builder.build();
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//配置服务器路径
.baseUrl(mServerUrl)
//返回的数据通过Gson解析
.addConverterFactory(GsonConverterFactory.create())
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//设置OKHttp模板
.client(httpClient)
.build();
}
return mRetrofit;
}
当处于开发阶段的时候,设置监听日志的拦截器。拦截有4个级别,分别是
- BODY
- HEADERS
- BASIC
- NONE
其中BODY
输出的日志是最全的。
添加相同的请求参数
为了更好的管理迭代版本,一般每次发起请求的时候都传输当前程序的版本号到服务器。
有些项目我们每次还会传用户id,token令牌等相同的参数。
如果在每个请求的接口都添加这些参数太繁琐。Retrofit可以通过拦截器添加相同的请求参数,无需再每个接口添加了。
步骤一,自己拦截器
public class CommonInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request oldRequest = chain.request();
// 添加新的参数
HttpUrl.Builder authorizedUrlBuilder = oldRequest.url()
.newBuilder()
.scheme(oldRequest.url().scheme())
.host(oldRequest.url().host())
.addQueryParameter("device_type", "1")
.addQueryParameter("version", BuildConfig.VERSION_NAME)
.addQueryParameter("token", PreUtils.getString(R.string.token))
.addQueryParameter("userid", PreUtils.getString(R.string.user_id));
// 新的请求
Request newRequest = oldRequest.newBuilder()
.method(oldRequest.method(), oldRequest.body())
.url(authorizedUrlBuilder.build())
.build();
return chain.proceed(newRequest);
}
}
实现原理就是拦截之前的请求,添加完参数,再传递新的请求。这个位置我添加了四个公共的参数。
然后再Retrofit初始化的时候配置。
if (mRetrofit == null) {
OkHttpClient httpClient;
OkHttpClient.Builder builder=new OkHttpClient.Builder();
//添加公共参数
builder.addInterceptor(new CommonInterceptor());
httpClient=builder.build();
//构建Retrofit
mRetrofit = new Retrofit.Builder()
//....
.client(httpClient)
.build();
}
处理约定错误
除了常见的404,500等异常,网络请求中我们往往还会约定些异常,比如token失效,账号异常等等。
以token失效为例,每次请求我们都需要验证是否失效,如果在每个接口都处理一遍错误就有点太繁琐了。
我们可以统一处理下错误。
步骤一,Retrofit初始化时添加自定义转化器
mRetrofit = new Retrofit.Builder()
//配置服务器路径
baseUrl(mServerUrl)
//配置回调库,采用RxJava
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
//配置转化库,默认是Gson,这里修改了。
.addC