retrofit实际上就是对gson和okhttp进行了结合封装。一般来说,我们需要发送网络请求,然后处理返回的数据。而通过retrofit,可以快速简洁的完成这一系列操作,一般还要结合RxJava,让整个过程更加优雅。
准备工作:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
在gradle中加入这两个库,第二个用于将相应数据转换成我们需要的数据类型。converter(转换器)
推荐使用插件GsonFormat,建立数据模型类文件后使用快捷键alt+s,将json字符串输入就可以快速生成相应的json数据类。
1.最简单的网络访问:
首先来回顾一下如何使用okhttp进行一次网络访问:
Request request=new Request.Builder()
.url(url)
.build();
Call call=client.newCall(request);//将请求封装成任务
call.enqueue...
需要新建request,然后使用onHttpClient和request生成Call,然后执行这个Call的任务。基本上每次网络访问都要重复这个过程,当然,我们可以自己把这个封装一下。
接下来看看retrofit封装后如何进行网络访问:
首先新建一个接口,然后在接口里定义方法,以后所有的网络请求方法也都放在这个接口里:
@GET("course/courseRelease_list")
Call<ResponceBody> getCourse();
这里的注解明显就是指定访问方式了,括号里的参数要结合BaseUrl生成完整的Url。可以发现,这里的Call类具有了泛型。这个类型的意义我们暂时不去考虑,就使用这个ResponceBody。
然后就开始使用了:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(BASE_URL)
.build();
AppUrl appUrl=retrofit.create(AppUrl.class);
Call<ResponseBody> call=appUrl.getCourse2(3,1);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
首先使用BaseUrl实例化Retrofit对象,BaseUrl其实就是URL前面那段不变的部分,他和上面GET后面的url拼接成最后的url。然后使用这个对象实例化接口,调用接口方法生成Call对象。
到这一步,接下来就和okhttp差不多了,进行同步或异步执行,异步时写回调接口。
onResponse中获得的response.body这里是一个ResponseBody对象。
2.请求拼接部分API:
(1)使用GET与POST指定访问方式,后面的参数拼接在BaseUrl后。
(2)使用Path替换掉URL中的动态部分:
@GET("{name}")
Call<ResponceBody> get(@Path("name") String urlName);
这里方法传入的参数urlName就会替换掉Url中花括号里的name,注解后面的参数与替换名保持一致,但是不能用这个来发送参数,发送参数可以用Query
(3)使用Query为GET添加参数:
@GET("course/courseRelease_list")
Call<TestBean> getCourse2(@Query("pageIndex") int pageIndex, @Query("courseType") int courseType);
注解后面的参数表示key,传入的是value。
(4)使用FormUrlEncoded和Field提交表单:
要提交表单就给方法加上@FormUrlEncoded注解,Field的使用方式和Query一样:
@FormUrlEncoded
@POST("user/login")
Call<User> updateUser(@Field("username") String name, @Field("password") String pass);
(5)使用Body在请求体中添加json:
@POST("aaa")
Call<MBean> send( @Body UserInfo body);
可以直接传对象,借助底层的gson可以完成对象和json的简单转化。
3.自动转换器:
至此还无法看出retrofit的强大之处,其一大优势在于简单的把返回的数据直接转换成我们制定的类型。
首先要为retrofit对象添加转换器:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
把接口中方法的泛型改成我们需要的数据类型,然后这样使用:
call.enqueue(new Callback<TestBean>() {
@Override
public void onResponse(Call<TestBean> call, Response<TestBean> response) {
TestBean bean=response.body();
}
可以看到,response.body直接返回了一个我们需要的类型的对象,retrofit帮我们进行了转换。
虽然我们都知道这是gson的强大,但是挺神奇的。
转换数组:
Type listType = new TypeToken<List<PostItem>>() {}.getType();
List<PostItem> list1 = new Gson().fromJson(item.getContent(), listType);
开发中遇到的一个问题是,如果对象的一个字段是一个json对象或数组,那么就不能将其转换成字符串。
4.与RxJava结合使用:
retrofit提供了与rxjava完美结合的方法:接口中的方法可以直接返回被观察者。
首先要添加和rxjava有关的转换器:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.BaseURL.com/")
.addConverterFactory(GsonConverterFactory.create())//自动通过Gson转josn,上面有提到
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//添加RxJava支持
.build();
然后定义方法:
@GET("aaa") Observable<MBean> get();
泛型还是需要的结果数据类型。
url.get()
.subscribeOn(Schedulers.io())
.subscribe(new Subscriber<MBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(MBean mBean) {
}
});
使用起来非常方便,可以发现,被观察者调用观察者方法发送数据的过程也被封装了,简直666.