Retrofit从开始到放弃
来源:互联网 发布:淘宝怎么搜翻墙代理 编辑:程序博客网 时间:2024/05/16 12:16
概述
在学习 Retrofit2 的过程中受到了一些阻力,现 Retrofit2 学会使用了,特此写此文验证所学知识。同时也希望帮助和我一样在学习Retrofit2遇到困难的猿们。
当我在刚开始学习 Retrofit2 的时候并不知道Retrofit2是什么东西,后来逐渐了解 “它可能是一个方便我们网络请求的库 ,可以帮我们让请求网络变得更灵活、易于维护”。然后还可以和时下比较火热的RxJava进行完美融合。
先看看如何使用,如何进行一个简单的Get/Post请求
Retrofit2 入门
首先在build.gradle中添加如下代码,添加Retrofit2库
- 1
有的教程里写要手动添加okhttp的库,其实是不需要的,因为retrofit2封装了okhttp,不信自己编译下看看:
添加完库,我们开始正文。
我们在项目中进行网络请求时,肯定不是一个地址吧,那么这些请求地址存放在哪呢?是在哪个类里请求就在哪个类里存放,还是统一放在一个专门存地址的类中呢?
我在学习Android期间就是哪里有请求就放哪里,后来有人告诉我要集中存放。于是后来就建立一个AppURL.java所有地址都存放这里。
然而Retrofit2这里也可以这么理解:专门有一个‘地方’来存储链接地址(也可以创建多个‘地方’存储)。这个‘地方’不是类而是接口,在这个接口中可以设定请求地址的一些信息。就像这样:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
- 获取“AppURL”对象(创建请求服务)
- 1
- 用AppURL对象得到具体请求对象(获取请求服务方法 )
- 1
后期也会在这一步中进行设置链接参数、请求头等
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
- 开始(异步)请求
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
好了,现在一个简单的网络请求就写完了。不是很难吧(当时我可是觉得挺难 ^_^)
单单会这些是远远不够的,那么我们如何来满足项目中各种各样的需求呢?请继续看
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
Retrofit2 进阶
自动解析
其实在Retrofit2中,我们不用自己来解析数据,Retrofit2可以帮我们自动解析,怎么做呢?请看:
0. 添加
在Retrofit2中是用Gson解析的,所以我们要在build.gradle中添加。
- 1
有写教程说还有添加gosn库,经过测试是不需要的,converter-gson中已经封装了gson库。
需要注意的是converter-gson和retrofit版本号应为一致,在这里我都用2.1.0
1. 创建Bean
创建一个JavaBean,用于解析服务器返回数据。就和我们平常自己解析创建的Bean一样,推荐用As的插件JsonFormat,挺方便的。
我们创建一个Bean起名为MBean.java(随便起的)
2. 为retrofit添加addConverterFactory
添加后的代码如下:
- 1
- 2
- 3
- 4
- 修改泛型
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
这样输出的就直接是用Gson解析好的MBean数据了。
retrofit不仅仅只支持gson,还支持其他许多json解析库。 如:
Jackson、Moshi、Protobuf、Wire、Simple XML、Scalars (primitives, boxed, and String) 具体请看官网
固定地址/路径替换
说到固定地址了,那么固定地址长什么样呢?
- 1
- 2
- 3
- 4
- 5
那么应该如何请求呢?除了上面例子中的写法还可以这样写:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
@Path的应该作用暂且理解为 为上面的GET请求传值吧
带参地址
带参地址长这样子:
- 1
- 2
- 3
上个用的是@Path,这回用的是@Query其实和@Path一样
直接看例子:
- 1
- 2
- 3
- 4
- 5
Post带Body请求
使用@Body来声明即可,如下:
- 1
- 2
- 3
- 4
- 5
- 6
学到这里,一般的网络请求都可以了进行,可以应付一阵子了。
还有一些要求较高的请求,请看下节。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
Retrofit2 大成
如果看到这里,相信对Retrofit2的基本请求会用了,那么这节就说一说其他的网络请求。
表单(FormUrlEncoded)
我们可以使用@FormUrlEncoded注解来发送表单数据。使用 @Field注解和参数来指定每个表单项的Key,value为参数的值。
- 1
- 2
- 3
单文件上传(Multipart)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
@Part 后面支持三种类型,{@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、任意类型;
动手测试:username的RequestBody 换成String是否可以
多文件上传
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
也可以都塞Map里上传,也可以只在Map中上传文件,随你喽~
文章结尾有参考链接。不一样的上传方式。
请求头
- 固定请求头
- 1
- 2
- 3
- 4
- 5
- 6
- 动态请求头
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 固定+动态
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
其他
注意XXXMap的使用, 比如@PathMap,@FieldMap等,具体怎么使用,可以自己研究,研究不出来的可以参考结尾处的文章。
下载文件得说说,在Retrofit2中下载文件是默认存储到缓存中,也就是说不能进行大的文件下载,如果要下载大文件要用 @streaming 。但话说回来了,下载文件我们可以不用Retrofit2啊,直接用okhttp不就得啦
我们是可以添加 okhttpclient 到retrofit中去,这样可以来统一的log管理,给每个请求添加统一的header等,那么我们没有添加为什么没有报错呢? 因为在build()方法中会判断是否为空,如果我们没有添加okhttpclient 则就是空了,那么retrofit会自动给我们添加了一个new OkHttpClient();
- execute是同步执行 需要在子线程中执行、enqueue是异步执行。
- 看下我这几个图,整理一下思路吧
以上表格中的除HTTP以外都对应了HTTP标准中的请求方法,而HTTP注解则可以代替以上方法中的任意一个注解,有3个属性:method、path、hasBody, 这里是用HTTP注解实现的例子
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
注1:{占位符}和PATH尽量只用在URL的path部分,url中的参数使用Query和QueryMap 代替,保证接口定义的简洁
注2:Query、Field和Part这三者都支持数组和实现了Iterable接口的类型,如List,Set等,方便向后台传递数组。
- 1
- 2
Retrofit2 独断万古
首先说下如何和当前火热的RxJava进行配合使用。
- 引入RxJava支持 (版本号要一致)
- 1
- 写接口
- 1
- 2
- 通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持
- 1
- 2
- 3
- 4
- 5
- 使用
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
根据需要添加RxAndroid,这个版本号没有要求。
剩下的内容讲的主要是进行自定义 Converter 和 自定义CallAdapter。还有就是源码的解析。
这里可以参考结尾处的链接,不献丑了。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
说明:
接口名“AppURL ”可以随意定义,根据自己喜好。
第一行:代表get请求,请求地址为“设定的BaseURL/index” (BaseURL设定在下面介绍如何设定)
第二行:getIndex是方法名;Call是默认返回类型,暂且不要管能干什么。
下面我们看下如何使用这些地址进行网络请求:
1. 创建Retrofit对象,并设定BaseURL
- 1
- 2
- 3
需要注意的是BaseURL必须以‘/’结尾
- Retrofit从开始到放弃
- Dagger2+MVP+RxJava+Retrofit从放弃到入门
- Gmapping从开始到放弃—写一个TF 广播
- Gmapping从开始到放弃—写一个TF 监听
- GO 从入门开始放弃
- linux 安装opencv——从开始到放弃……
- Freemarker 从入门到放弃
- kmp从入门到放弃
- Dagger2从入门到放弃
- 推送 从入门到放弃
- 推送 从入门到放弃
- Python从入门到放弃
- vim从入门到放弃
- JAVA 从入门到放弃?
- markdown从入门到放弃
- Mycat从入门到放弃
- C++从入门到放弃
- Volatile从入门到放弃
- beyondCompare试用期到期解决办法
- 像 npm 一样在 Andriod 项目中引入 Gradle 依赖
- vue-basic
- 手把手教你实现RecyclerView的下拉刷新和上拉加载更多
- Putty远程调用linux命令
- Retrofit从开始到放弃
- exchange 2016卸载及重装的经历
- 高并发,高性能,高可用,分布式,集群,电商缓存架构
- 数据的完整性
- 在C语言中,double、long、unsigned、int、char类型数据所占字节数
- python 实现文件查找功能
- linux网络编程-----非阻塞connect
- jquery 监听div大小变化函数|div resize事件
- nginx 的高可用