准备工作
Retrofit 2 是一款Android网络请求框架,其底层是基于OkHttp实现的,它与其它网络框架的不同之处在于,它更多使用运行时注解的功能提供此功能。、
我学习这个框架的目的是为学习Rxjava打下基础
一开始当然是引入retrofit的库,具体的可以看retrofit的官方网站,里面列举了所有用法的例子,为了帮助大家快速的上手,我把导入包的方式列举在下面,当然最新的还是要去它的官网看的。
GRADLE
compile 'com.squareup.retrofit2:retrofit:2.4.0'
然而引入这个是不够的,大家还需要引入GSON转换的库,也在下面跟大家列举出来了。
com.squareup.retrofit2:converter-gson:2.3.0
当然不止这些转化的类型,还有其它很多库,我在这里就不一一列举了,大家想要的可以去它的官网看,至于有哪些类型大家可以参考下图:
Retrofit的Get请求
我们通过向淘宝的ip地址库发送Get请求来讲解如何使用Retrofit的Get请求,请求的顺序大致是:
- 定义返回值的实体类
- 定义一个网络接口
- 创建一个Retrofit对象
- 创建一个接口对象
- 实现接口
定义返回值的实体类
我们通过分析返回值来构造一个实体类,拿淘宝的ip地址库的返回值举一个例子,其返回值具体如下:
1 | { |
我们通过返回的值来构造一个Java Bean
类,具体的代码如下:
1 | public class TaoBaoInfo { |
定义一个网络接口
接着我们需要定义一个网络接口,具体的代码如下:
1 | public interface TaoBaoService { |
这里有几个特殊的地方,在@Get
后面的括号里面接着的是该请求的相对地址,其中Call
的一堆尖括号里面对应的是返回的数据类型,也就是我们第一步定义的实体类@Query("ip")
对应的是请求的数据对应的key
值,具体的我们可以分析一个请求的url
,具体url值如下:http://ip.taobao.com/service/getIpInfo.php?ip=59.108.54.37
这个url
中?
号后面跟着的是请求的数据,假如有多个数据的话要加上&
号,我们来举个例子,还是这个url,假如我们要加几个请求的数据,比如说时间,我们就可以这样写url:http://ip.taobao.com/service/getIpInfo.php?ip=59.108.54.37&time=12:00
那我们请求对于这种多个请求的情况就可以通过传入map
,那么具体的接口写法如下:
1 | public interface TaoBaoService { |
创建一个Retrofit对象
1 | Retrofit retrofit = new Retrofit.Builder() |
其重有两个要点:
- 设置
baseUrl
,也就是请求的基地址 - 设置转换的格式,我们这里把返回的结果转换成
Gson
或者String
,当然还有其它的选择,具体可以参照我们一开始提的准换格式的问题创建一个接口对象
这个主要是创建一个接口对象,没有什么好说的TaobaoService api = retrofit.create(TaoBaoService.class);
实现接口
实现接口的具体代码如下所示:
1 | api.getIpMsg("59.108.54.37").enqueue(new Callback<TaoBaoInfo>() { |
这里不用管线程切换的问题,回调就发生在主线程中。
对于第二种定义接口的方式,我们的实现方式如下所示:
1 | Map map = new HashMap<String,String>; |
用Path来代替路径
也许看这个标题会很疑惑,我们来用一个url来举一个具体的例子:http://ip.taobao.com/service/getIpInfo.php?ip=59.108.54.37
我们可以把基地址写成http://ip.taobao.com/
,后面接着的service可以被指定为一种路径,这种方式方便减少基地址的数量,也可以用来传输值,比如说之前的http://ip.taobao.com/service/getIpInfo.php?ip=59.108.54.37&time=12:00
可以被写成http://ip.taobao.com/service/getIpInfo.php/59.108.54.37/12:00
,也就是说传输的值直接被写进路径里面去了,接着我们来写如何具体实现这一方法,首先我们得重新写一个接口,具体的代码如下:
1 | public interface TaoBaoService { |
@Path
后面跟着的括号里面的值必须和@Get
括号里面的{path}
占位符一样。接着我们写实现接口的代码,具体代码如下:
1 | api.getIpMsg("service","59.108.54.37").enqueue(new Callback<TaoBaoInfo>() { |
Retrofit的Post请求
Retrofit
的Post
请求和Get请求有很多相似的地方,Post
的步骤也可以总结如下:
- 定义返回值的实体类
- 定义一个网络接口
- 创建一个Retrofit对象
- 创建一个接口对象
- 实现接口
其重步骤1和步骤3,4都是一样的,我们在这里只用讲解下步骤2,5,其具体的代码如下:
定义一个网络接口
1 | public interface UserService { |
其中要注意两个地方其一是FormUrlEncoded
,意思是Form表单提交,另一个@POST("api/user/dogetInfo")
是指定请求的类型,这里的是一个Post请求,UserInfo
处指的是返回的类型,也就是我们刚才根据返回的json
数据构造的类,@Field("username")
这里的括号里面的值是提交表单对应的key
值。
写完相应的接口我们在代码里面使用它,具体的代码如下先初始化接口:
实现接口
1 | api.getUserInfo("yuanlai").enqueue(new Callback<UserInfo>() { |
这里要插一句,这里是异步请求网络,回调的callback
是在UI线程里面执行的,所以我们可以直接地Toast
。当然了,Retrofit除了表单提交数据外,还可以通过把提交的数据转换成Json
格式发送到数据库。这里我只把一些代码简单地贴出来:
1 | public interface UserService { |
初始化接口一些操作跟我们刚才的操作没有区别,接着我们要定义一个提交的json类,具体代码如下:
1 | public class User { |
具体操作的代码如下:
1 | api.getUserInfoByJson(new User("yuanlai")).enqueue(new Callback<UserInfo>() { |