浅浅分析一下Retrofit

浅浅分析一下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去真正执行。

image-20220327125709384

​ 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()){@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {Log.e(TAG, "onFailure: 请求失败" );}
}

注解

​ Java注解用于为Java代码提供元数据。元数据呢,是描述数据的数据,主要用来描述数据属性的信息。既然是描述信息,作为元数据,注解不直接影响代码执行,但也有一些类型的注解可以用于影响代码执行。

​ 我们可以暂且把注解看做是标签。

请求类注解

http协议的注解有几种,这里就分了几种。

img

​ 我们平时用的多的是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键值对

标记类注解

img

@FormUrlEncoded
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。

注解解析

如果你下载了retrofit的包,查看它的代码,你会发现它里面有很多注解的声明。

比如说@HTTP的声明,里面写有它的属性并且可以赋默认值。

而我们发现定义这个注解时,它的前面还用到了其他的注解。

称为元注解,给注解进行注解。

Retention表明了生命周期,Target表明了注解的使用场景限定,比方说可以给方法进行注解,给参数进行注解。

image-20220327121121150

好处

okhttp代码段长 次数多

retrofit可集中管理,而且便于修改


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部