前言
相信小伙伴们就算没有用过retrofit也听说过吧,retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,其内部就是对okhttp进行的一个封装,那么接下来,我就给大家带来Retrofit在平时开发中的一些用法。
用法
1.在你的项目中的gradle中配置
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.1.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.0'
这里说明一下,compile 'com.squareup.retrofit2:converter-gson:2.1.0'
主要是针对返回值做一个gson解析,一般都会加上,而compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0''
主要是配合rxjava使用,稍后会给大家带来retrofit如何配合rxjava使用。
2.自定义一个interface并且在里面配置请求
public interface Service {
@FormUrlEncoded
@POST("user/login")
Call<LoginResponse> Login(@FieldMap Map<String, String> map);
现在看不懂没关系,大家只要知道,@POST代表是一个post请求,后面的("user/login")表示请求地址,泛型代表的是你要的返回值,方法里面的参数代表请求要携带的参数,登录一般都会要帐号密码,所以这里写的是一个Map集合。
3.开始做网络请求
//拿到一个builder
Retrofit.Builder builder = new Retrofit.Builder();
//添加你的baseUrl,一般在开发中,baseUrl是固定的,大家可以定义一个常量
builder.baseUrl("www.baseurl.com/");
//添加Gson支持
builder.addConverterFactory(GsonConverterFactory.create());
//拿到一个retrofit对象
Retrofit retrofit = builder.build();
//传入你之前定义的一个接口
Service service = retrofit.create(Service.class);
Map<String, String> map = new HashMap<>();
map.put("name","用户名");
map.put("psw","密码");
//调用接口中你自己定义的方法,并传入参数,拿到一个call对象
Call<LoginResponse> call = service.Login(map);
//发送异步请求并添加回调,这里还有一个execute()是同步请求
call.enqueue(new Callback<LoginResponse>() {
@Override
public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
//请求成功,拿到返回值
}
@Override
public void onFailure(Call<LoginResponse> call, Throwable t) {
//请求失败
}
});
到了这里,一个完整的网络请求也就完成了,那么接下来给大家介绍介绍一些常用的注解。
4.常用注解介绍
@GET
get请求,分为不带参数,一个参数,多个参数
- 不携带参数
@GET("user/login")
Call<LoginResponse> Login();
- 携带一个参数
@GET("user/login")
Call<LoginResponse> Login(@Query("name") String name);
- 携带2个或多个参数
@GET("user/login")
Call<LoginResponse> Login(@QueryMap Map<String,String> map);
@POST
post请求,分为一个参数,多个参数
- 携带一个参数
@FormUrlEncoded
@POST("user/login")
Call<LoginResponse> Login(@Field("name") String name);
- 携带2个或多个参数
@FormUrlEncoded
@POST("user/login")
Call<LoginResponse> Login(@FieldMap Map<String, String> map);
上面一些用法基本能满足大多数日常开发,如果还有哪些需要说明的欢迎留言。
5.结合RxJava使用
RxJava相信就不用我多介绍了,有多好用我相信大家深有体会,不会用的小伙伴请自行百度,RxJava教程还是比较多的。如果要结合RxJava使用,其实也不难,这里给大家举个栗子。
1. 首先把接口中的Call换成Observable,比如这样
public interface Service {
@FormUrlEncoded
@POST("user/login")
Observable<LoginResponse> Login(@FieldMap Map<String, String> map);
2. 然后依然是前面的步骤,拿到Service对象
//因为接口定义的返回是Observable,所以这里可以直接链式调用
service.Login(map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<LoginResponse>() {
@Override
public void accept(@NonNull LoginResponse loginResponse) throws Exception {
//请求完成,做自己的事
}
});
到此为止一个请求就完成了,大家可以对Retrofit做一个封装,如果有时间,我之后也会给大家带来Retrofit的封装。