Retrofit 是一个Android网络框架,是squareup 公司出品, 内部是基于OkHttp 去实现网络请求,Retrofit 与 OkHttp的关系是,Retrofit 负责网络调度,Okhttp 负责网络执行。 下面介绍下Retrofit
1) Retrofit 基本使用
1. 引入 Retrofit 相关库:
implementation 'com.squareup.retrofit2:retrofit:2.5.0' //retrofit网络请求框架
implementation 'com.squareup.retrofit2:converter-gson:2.5.0' //retrofit添加Json 支持
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' //retrofit添加Rxjava支持
2. 定义接口:
@Headers("Accept:application/json")
@POST("article/list")
Call> postArticleList(@Body RequestBody body);
使用注解@POST("article/list") 声明了url 路径, 用注解@Body 声明了请求参数, 使用Call
3. 初始化Retrofit,获取Retrofit 对象, 接口实例对象, 网络工作对象:
//新建Retrofit 对象,okHttpClient对象作为参数
new Retrofit.Builder()
.client(client)
.baseUrl(Constans.BaseUrl)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
//创建接口实例对象
ApiUrl apiUrl = retrofitClient.create(ApiUrl.class);
//创建网络工作对象
Call> workerCall = apiUrl.postArticleList(body);
//请求网络获取数据
workerCall.enqueue(new Callback>() {
@Override
public void onResponse(Call> call, Response> response) {
}
@Override
public void onFailure(Call> call, Throwable t) {
}
});
2) Retrofit 主要工作
Retrofit 不直接做网络请求,Retrofit 负责网络调度,做些配套工作,包括创建发起请求Call对象, 接受数据的CallBack 对象,做数据转换Converter对象,等工作。 Retrofit 在底层统一 调用OkHttp 去做网络处理。
Retrofit 的好处是,可以根据定义的接口,灵活的生成对象的网络工作对象,然后使用这个对象访问网络。
3)功能扩展
Retrofit 的扩展,可以从三个方面扩展:
1. OkHttpClient :
Retrofit 底层统一使用OkHttp 去请求网络, Okhttp 不能替换为别的网络框架, 但是扩展OkHttpClient, 最常见的扩展是定义Interceptor拦截器。
//在初始化OkHttpClient时,添加自定义拦截器
new OkHttpClient().newBuilder()
.readTimeout(Constans.DEFAULT_TIME, TimeUnit.SECONDS)//设置读取超时时间
.connectTimeout(Constans.DEFAULT_TIME, TimeUnit.SECONDS)//设置请求超时时间
.writeTimeout(Constans.DEFAULT_TIME,TimeUnit.SECONDS)//设置写入超时时间
.addInterceptor(new LogInterceptor())//添加打印拦截器
.retryOnConnectionFailure(true)//设置出现错误进行重新连接。
.build();
2. addConverterFactory():
.addConverterFactory(GsonConverterFactory.create())
将网络请求返回数据转换为另一种数据对象,这里是转换为json 数据对象。
3. addCallAdapterFactory
addCallAdapterFactory(RxJava2CallAdapterFactory.create())
Observable> postArticle(@Body RequestBody body);
将Retrofit 执行网络请求的Call对象转换为接口中定义的Call对象, 这里是将Retrofit 的Call对象转换为接口中定义的
RxJava的 Observable
参考:
https://www.jianshu.com/p/f57b7cdb1c99