栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅浅分析一下Retrofit

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

​ 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 get(@Query("username")String username, @Query("password")String pwd);
    @POST("post")
    //post方法有表单提交multipart方式提交 定义了提交数据的方式
    //请求方式不同 注解也不同哦
    //表单方式主要针对字典或元组方式的参数,非表单主要针对字符串类型的参数
    @FormUrlEncoded
    //定义参数。Post接口定义参数,要写@Field注解,需要传递一个字符串,这是请求接口的时候参数的名字
    //注意分清形参的名字和请求的参数名字
    Call 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 call = httpbinService.post("mqh", "123456");
call.enqueue(new retrofit2.Callback call, Response response) {
         
     }
    @Override
    public void onFailure(Call 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可集中管理,而且便于修改

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/781216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号