Retrofit的简单使用

Retrofit又是Square公司主导的一个网络请求开源框架。它是Android和java的HTTP一种安全客户端。还是按照OKHttp的简单实用的套路我们今天继续学习又一个很火的网络请求客户端。学习它是为了以后与Rxjava配合使用。最终实现项目的主体框架:Retrofit+Rxjava+Dagger+MVP。因为前面已经有了解过Rxjava的简单使用。所以接下来我们主要任务是深入MVP框架、Dagger注解,Retrofit结合Rxjava的封装使用等等。今天我们主要了解的是Retrofit的简单使用。

添加以下依赖:

compile 'com.squareup.retrofit2:retrofit:2.1.0'//主要依赖
compile 'com.squareup.retrofit2:converter-gson:2.1.0'//gson对象序列化
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//配合Rxjava的使用

请求配置:

由于Retrofit2.x已经集成了OkHttp3.0。因此我们在全局变量配置的时候可以用到OkHttpclient实例。除此之外还可以添加Gson库、配合RxJava的rx库。这里我们简单的配置一下全局参数。

OkHttpClient.Builder okBuilder = new OkHttpClient.Builder();
//超时设置
okBuilder.connectTimeout(15, TimeUnit.SECONDS);
okBuilder.readTimeout(15, TimeUnit.SECONDS);
okBuilder.writeTimeout(20, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.tngou.net/")//结尾一定要带"/"
.client(okBuilder.build())//添加OkttpClient实例
.addConverterFactory(GsonConverterFactory.create())// Gson序列化生成库
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Rx库
.build();
//RetrofitService接口通过Retrofit实例实现
RetrofitService retrofitService = retrofit.create(RetrofitService.class);

构造API接口:

每个Retrofit请求都要通过Retrofit实例将你的Api接口改造为Java接口。下面Api接口根据不同请求(主要展示POST,GET。除此之外还有DELETE,PUT,HEAD)方法、不同请求参数做相关介绍,具体介绍请看代码注释。这里的测试我们用的是免费的美女图片API接口-天狗美阅,由于天狗美阅返回的数据接口都是一样的格式因此我们自己写一个统一ResultBean,其它实体类继承它就好了。之后对应不同接口返回不同的实体类对象将T替换成相应的实体类对象结合GsonConverterFactory就可以快速拿到返回的数据了。

public class ResultBean {
public Boolean status;//请求是否成功
public String msg;//返回的错误信息
}

public interface RetrofitService {
//GET请求,可换成"@POST"作为为POST请求,
//Call里面是请求回调的实体类。
@GET("tnfs/api/classify")
Call<GalleryclassBean> listGalleries();//图片分类
//"@QueryMap"传入多个键值对参数的。
@GET("tnfs/api/list")
Call<GalleryBean> listGalleries(@QueryMap Map<String, String> options);//图片列表
//"@Query"传入单个键值对参数的。
@POST("tnfs/api/list")
Call<GalleryBean> listGalleries(@Query("page") String page, @Query("rows") String rows, @Query("id") String id);//图片列表
//"@Body"传入对象。大多用于POST
@POST("tnfs/api/list")
Call<GalleryBean> listGalleries(@Body RequestBody requestBody);//图片列表
//"@FormUrlEncoded"表单请求,传递键值对参数的时候要用到"@Field"注释
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);//官方文档
//多种类型请求的时候要用到"@Multipart",并且要用到“@Part”注释
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);//官方文档
//"@Header"添加单个键值对的请求头
@Header("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();//官方文档
//"@Header"添加多个键值对的请求头
@Header({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("widget/list")
Call<List<Widget>> widgetList();//官方文档
//"@Header"添加,authorization为null的时候请求头会被忽略,添加toString会重新被调用
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization);//官方文档
}

发起异步请求

与OKHttp一样,Retrofit也有自己的异步请求,而且使用的方法也很像,均有两个回调方法,一个void onResponse(Call call, Response response),一个void onFailure(Call call, Throwable t),其中都有一个Call的参数。call包含了请求的具体信息,也可以通过call取消请求。而Response网络请求回调的具体信息。详情看官方文档。

//发出异步请求
retrofitService.listGalleryclasses().enqueue(new Callback<GalleryclassBean>() {
@Override
public void onResponse(Call<GalleryclassBean> call, Response<GalleryclassBean> response) {
if (response.code() == 200) {//请求成功
List<Galleryclass> list = response.body().tngou;//获取分类列表
if (response.body().status) {
for (int i = 0; i < list.size(); i++) {
Log.e(TAG, list.get(i).keywords);//
}
} else {
Log.e(TAG, response.body().msg);//服务端的错误逻辑,具体就有没有更多数据之类。
}
}
}
@Override
public void onFailure(Call<GalleryclassBean> call, Throwable t) {
//异常,网络原因居多
}
});

发起同步请求

不能在主线程中发出同步请求。

new Thread(new Runnable() {
@Override
public void run() {
try {
Response<GalleryclassBean> galleryclassBeanResponse = retrofitService.listGalleryclasses().execute();
if (galleryclassBeanResponse.isSuccessful()) {
List<Galleryclass> list = galleryclassBeanResponse.body().tngou;
if (galleryclassBeanResponse.body().status) {
for (int i = 0; i < list.size(); i++) {
Log.e(TAG, list.get(i).keywords);
}
} else {
Log.e(TAG, galleryclassBeanResponse.body().msg);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();

Retrofit基本封装:

public static Retrofit getRetrofit() {
OkHttpClient.Builder okBuilder = new OkHttpClient.Builder();
//超时设置
okBuilder.connectTimeout(15, TimeUnit.SECONDS);
okBuilder.readTimeout(15, TimeUnit.SECONDS);
okBuilder.writeTimeout(20, TimeUnit.SECONDS);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.tngou.net/")//结尾一定要带"/"
.client(okBuilder.build())//添加OkttpClient实例
.addConverterFactory(GsonConverterFactory.create())// Gson序列化生成库
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//Rx库
.build();
return retrofit;
}

参考资料:官方文档

坚持原创技术分享,您的支持将鼓励我继续创作!