概述:网络请求框架第四弹,其实并不是Retrofit2.0的封装,只是简单的介绍和使用,至于封装,会在介绍完RxJava后,将Retrofit2.0和RxJava配合使用进行封装。
一 Retrofit的简单介绍。
Retrofit是Square公司开源的一款网络请求框架,官网地址http://square.github.io/retrofit/ 目前 已经已更新至 2.0 版本,本篇文章只对2.0版本进行简单的介绍和使用。以前的版本请自行Google。Retrofit是rest形式的安卓客户端请求库(Rest的原理就是向一个资源的uri发送get、post、put和delete进行获取、创建、保存、删除操作)。Square公司开源的其他框架有:日历控件框架 android-times-square,依赖注入框架 dagger,一部图片加载框架 Picasso,网络请求okHttp 等。
二 Retrofit2.0的简单使用
1 添加依赖
a:Retrofit2.0的依赖
compile 'com.squareup.retrofit2:retrofit:2.0.1'
b:gson转换器的依赖
compile 'com.squareup.retrofit2:converter-gson:2.0.1'
2 关于Retrofit2.0中url的定义方式
a:
b:
c:
从上面的三种方式可以看出 在retrofit中url是以baseUrl与@url的方式组合在一起的 不难看出 只有第二种才最符合我们的使用习惯。总结一下 在定义url时 baseUrl需要以“/”结尾 @url不以“/”开头。
按照这种格式来定义我们的第一个Api
baseUrl为:https://api.github.com/
@GET("repos/{owner}/{repo}/contributors")
Call<ResponseBody> contributorsBySimpleGetCal(@Path("owner") String owner, @Path("repo") String repo);
则我们拼接的整体url为:https://api.github.com/repos/square/retrofit/contributors
3发出一次请求
a: 构建retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
b:构建接口对象
ApiService service = retrofit.create(ApiService.class);
c:接口对象调方法传入参数 返回 请求对象。
Call<ResponseBody> call=service.contributorsBySimpleGetCal("square","retrofit");
d:用c中返回的call对象 执行请求(例子中是异步请求)
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
e:在call执行异步请求中传入了一个回调接口 里面有两个方法 一个成功的回调方法 一个失败的回调方法。在成功的回调方法中 我们拿到了一个 Response 对象 。这个对象就是我们需要进行处理的数据。
f:取消请求:
call.cancel();
4 对返回的response进行处理
在回调接口的成功方法中 我们拿到了response对象
我们来看看response有哪些方法:
这些方法 我就不赘述了 通过body方法 得到 ResponseBody
ResponseBody responseBody=response.body();
我们来看看responseBody有哪些方法
图片上箭头所示的方法可以看出 通过 responseBody 的 byte方法可以得到字节数组。byteStream方法可以拿到输入流 contentType可以拿到多媒体资源 最重要的string方法可以拿到json字符串 通过这些方法我们不难看出 retrofit不仅json字符串的获取 也支持多媒体文件的操作 以及文件的操作。
同过string方法拿到字符串
String json=responseBody.string();
在这里就需要对json字符转化成java对象了 通用的处理工具有 Google推荐的Gson 阿里巴巴的fastJson 以及 json 有人肯定想既然 有一系列的转化方法来转化json字符串 为何 retrofit不直接转化json字符串成java对象返回给我们呢。是的 retrofit2.0提供了这样的操作 在构建retrofit的时候 添加Gson转换器
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.**addConverterFactory(GsonConverterFactory.create())**
.build();
既然retrofit要帮我们转化json字符串 那就需要转入需要转化的类型 修改我们的api 在定义接口时将类型传入
@GET("repos/{owner}/{repo}/contributors")
Call<List<Contributor>> contributorsBySimpleGetCal2(@Path("owner") String owner, @Path("repo") String repo);
现在看我们的回调接口的成功方法中是如何处理的
ArrayList<Contributor> contributorsList = (ArrayList<Contributor>) response.body();
这样步骤就变简单多了
5 为retrofit2.0添加日志功能
在retrofit2.0中是没有日志功能的 但是由于retrofit2.0依赖于okHttp的所以 我们可以通过okHttp的拦截器功能来添加日志功能
//构造日志拦截器
HttpLoggingInterceptor loggingInterceptor=new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//构造OkHttpClient 并设置拦截器
OkHttpClient client=new OkHttpClient.Builder()
.addInterceptor(loggingInterceptor)
.build();
//构造retrofit 并设置OKHttpClient
Retrofit retrofit=new Retrofit.Builder()
.client(client)
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
结果如下 已成功添加日志功能
6 为retrofit请求添加请求头
a:利用注解在Api接口中添加请求头
既然retrofit2.0这么强大 肯定是有关于请求头Header的操作的
我们可以看到 有两种方法
Header一次添加一个
Call<List<Contributor>> contributorsBySimpleGetCal3(@Header("name") String name, @Path("owner") String owner, @Path("repo") String repo);
Headers一次添加多个
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("repos/{owner}/{repo}/contributors")
Call<List<Contributor>> contributorsBySimpleGetCal3( @Path("owner") String owner, @Path("repo") String repo);
b:利用okHttp3 在构建OKHttpClient时添加拦截器设置请求头
//构造OkHttpClient 并设置拦截器
OkHttpClient client=new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request=chain.request().newBuilder()
.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
.addHeader("Accept-Encoding", "gzip, deflate")
.addHeader("Connection", "keep-alive")
.addHeader("Accept", "*/*")
.addHeader("Cookie", "add cookies here")
.build();
return chain.proceed(request);
}
})
.addInterceptor(loggingInterceptor)
.build();
三 总结
今天为大家带了Retrofit2.0的入门篇 其实没什么东西 就是简单的介绍和使用。本文参考了 李江东的 Retrofit2.0使用详解 参考了 泡在网上的日子 Retrofit 2.0:有史以来最大的改进 这里我表示深深的感谢