浅浅分析一下Retrofit
文章目录
- 浅浅分析一下Retrofit
- 简单介绍
- 示例
- 根据接口创建Java接口:
- 创建retrofit对象,并生成接口实现类对象
- 注解
- 请求类注解
- 参数类注解
- 标记类注解
- 注解解析
- 好处
要想实现和服务器的通信,我们需要使用通讯间的协议来进行请求,最常见的协议是HTTP协议。
安卓实现网络协议的方法有很多,因为最底层的网络实现很麻烦,现在我们会使用已经封装好的第三方库,比如上节课讲的okhttp就是其中很受欢迎的一个。而Retrofit又是后来基于OkHttp封装的一个网络请求框架,也是由square公司贡献的一个处理网络请求的开源项目。不过既然是它的上层框架,自然在某些方面能做得比okhttp更好一些。也因此现在很多项目都用的retrofit。
比如说,okhttp使用过程中接口配置繁琐,每发起一个请求都要新建一个Request,当要配置复杂请求(body,请求头,参数)时尤其复杂,一堆代码。而Retrofit可以在接口中声明同一个服务器的众多接口,接口请求更加简便,标注注解@GET、@POST、@Path、@Body等就形成一个网络请求,使用的时候只需要新建一个request就可以与众多接口连接!
那就请速速进入retrofit的学习叭!
简单介绍
Retrofit采用的是动态代理模式,动态代理就是可以在运行期动态创建某个interface的实例,会按照所传进来的参数进行相应的处理。每当不同接口方法执行时,动态代理都会拦截该请求,对接口中的注解,参数进行解析,构建出不同的Request,最后则交给OkHttp去真正执行。
Retrofit使用注解+java接口来定义后台服务API接口。
示例
这里的示例只是为了讲解更加清晰,并不包含retrofit使用的完整操作。
根据接口创建Java接口:
例如:
接口url:http://www.httpbin.org/get
服务器域名:http://www.httpbin.org/
接口:post
参数:username,password
接口url:http://www.httpbin.org/get
接口:get
参数:username,password
在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置
public interface HttpbinService {
//http://www.httpbin.org/post username = username;
@GET("get")
//表明下面的方法会用get方式来进行网络请求
//get方法要用@Query注解
//方法名无所谓 看注解
Call<ResponseBody> get(@Query("username")String username, @Query("password")String pwd);
@POST("post")
//post方法有表单提交\multipart方式提交 定义了提交数据的方式
//请求方式不同 注解也不同哦
//表单方式主要针对字典或元组方式的参数,非表单主要针对字符串类型的参数
@FormUrlEncoded
//定义参数。Post接口定义参数,要写@Field注解,需要传递一个字符串,这是请求接口的时候参数的名字
//注意分清形参的名字和请求的参数名字
Call<ResponseBody> postForm(@Field("username")String username,@Field("password")String pwd);
}
如果使用原始的retrofit使用方法的话,接口返回的是call类型,要带个尖括号<>,里面带泛型,这里写ResponseBody。
(ResponseBody是okhttp3包里面的,Call是retrofit包里面的,不要导错了嘿)
创建retrofit对象,并生成接口实现类对象
retrofit和http一样也是用的构建者模式进行管理。什么是构建者模式呢?大概是说的一个类内部很复杂,要正常使用的话要去理解这个类内部的原理,为了使用者能够更好地使用和管理它,就按部就班的来动态表示。
Retrofit retrofit = new Retrofit.Builder()
//服务器域名
.baseUrl("http://www.httpbin.org/")
.build();
HttpbinService httpbinService = retrofit.create(HttpbinService.class);
但是我们前面有提到,retrofit有个优势就是只要创建一个就可以使用多次。
所以如果在oncreate方法把他创建一次,就可以使用多次啦。
就像下面这样
在你的网络请求方法里面
retrofit2.Call<ResponseBody> call = httpbinService.post("mqh", "123456");
call.enqueue(new retrofit2.Callback<ResponseBody()){
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e(TAG, "onFailure: 请求失败" );
}
}
注解
Java注解用于为Java代码提供元数据。元数据呢,是描述数据的数据,主要用来描述数据属性的信息。既然是描述信息,作为元数据,注解不直接影响代码执行,但也有一些类型的注解可以用于影响代码执行。
我们可以暂且把注解看做是标签。
请求类注解
http协议的注解有几种,这里就分了几种。
我们平时用的多的是get和post
get一般我们用来向服务器获取信息,post一般用于提交信息去服务端。
但是在安卓,大部分情况不管是查询信息还是提交信息都用post。
注解 | 类型 | 作用 |
@GET | 方法注解 | 表明HTTP请求方法为GET,(可选)注解的value属性用来设置相对/绝对url |
@POST | 方法注解 | 表明HTTP请求方法为POST,(可选)注解的value属性用来设置相对/绝对url |
留意HTTP注解,可替换以上所有的注解。
@HTTP(method = "get", path = "get", hasBody = false)
参数类注解
添加参数的时候要用到它
这里列出部分,更多的可以自行冲浪搜索。
注解 | 类型 | 作用 |
@Query | 参数注解 | 用于get中请求参数 |
@Field | 参数注解 | 多用于post中请求参数,以表单形式传送数据,需要与FormUrlEncoded结合使用 |
@Body | 参数注解 | 用于非表单请求体 |
@Url | 参数注解 | HTTP请求的url路径(相对/绝对),可以包含{path_holder},如:http://xxx.com/{user_holder}/detail |
@FieldMap | 参数注解 | 以map形式传入的form表单参数 |
@Header | 参数注解 | 表明此参数用作HTTP请求的header,key为注解的value值 |
@HeaderMap | 参数注解 | 以map形式传入的多个header键值对 |
标记类注解
@FormUrlEncoded
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
注解解析
如果你下载了retrofit的包,查看它的代码,你会发现它里面有很多注解的声明。
比如说@HTTP的声明,里面写有它的属性并且可以赋默认值。
而我们发现定义这个注解时,它的前面还用到了其他的注解。
称为元注解,给注解进行注解。
Retention表明了生命周期,Target表明了注解的使用场景限定,比方说可以给方法进行注解,给参数进行注解。
好处
okhttp代码段长 次数多
retrofit可集中管理,而且便于修改