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

android retrofit下载多文件 安卓retrofit原理_java

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协议的注解有几种,这里就分了几种。

android retrofit下载多文件 安卓retrofit原理_服务器_02

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

标记类注解

android retrofit下载多文件 安卓retrofit原理_HTTP_03

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

注解解析

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

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

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

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

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

android retrofit下载多文件 安卓retrofit原理_HTTP_04

好处

okhttp代码段长 次数多

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