安卓网络请求框架第四弹——Retrofit2.0入门篇
来源:互联网 发布:unity3d settexture 编辑:程序博客网 时间:2024/06/07 16:53
概述:网络请求框架第四弹,其实并不是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:有史以来最大的改进 这里我表示深深的感谢
- 安卓网络请求框架第四弹——Retrofit2.0入门篇
- Retrofit2.0+RxJava+RxAndroid——强强联合的网络请求框架
- Retrofit2.0+RxJava+RxAndroid——强强联合的网络请求框架
- Retrofit2.0+RxJava+RxAndroid——强强联合的网络请求框架
- 网络请求篇--Retrofit2.0+RxJava+OkHttp
- Android 网络请求框架 Retrofit2.0实践使用总结
- Android 网络请求框架 Retrofit2.0实践使用总结
- Android 网络请求框架Retrofit2.0使用笔记
- 网络请求框架之Retrofit2.0基本讲解
- Android RxJava2+Retrofit2搭建网络请求框架
- Retrofit2+Rxjava2网络请求框架的封装
- 安卓网络请求框架第二弹——HttpUrlConection的封装
- 安卓网络请求框架第三弹——OkHttp的封装
- 安卓入门第四篇
- 安卓网络请求框架对比
- 安卓常用网络请求框架总结
- Retrofit2.0 简单实现的网络请求
- Android 实现Retrofit2.0请求网络
- Android Studio 不打印日志的解决方案
- shape和selector的结合使用
- 内存映射文件(Memory Mapping File)
- dpkg: error processing archive /var/cache/apt/archives/libc6-dev-amd64_2.19-0ubuntu6.9_i386.deb (--u
- 二级随笔第三弹
- 安卓网络请求框架第四弹——Retrofit2.0入门篇
- oracle截取两位小数
- 201604-4(游戏)
- 文章标题
- vim 退格键(backspace)不能用
- Android中Fragment的使用
- Python中拷贝问题
- 数组去重
- 记阿里前端第一次电面(蚂蚁金服)