Retrofit框架使用说明
-
retrofit简介
retrofit结构
- retrofit是一个中间件,接口访问请求的封装组件,内部集成okhttp(也可以外面设置进去)形象点说retrofit和okhttp就是泡面(okhttp)和鸡蛋火腿肠(retrofit)关系,泡面单独能吃但是要想好吃那就得有蛋又有肠才行。
- 接口访问服务器并且获取服务器数据还是okhttp实现,retrofit则是通过注解的方式,将接口的相对地址,接口参数,header,url编码等解耦封装,让用户更优雅更方便的使用okhttp。
- retrofit可以通过api的方式注入多个数据解析器,用来解析接口响应数据成为用户想要的数据格式,比如gson,string,xml等(提供有系统解析器,同时可以自定义解析在初始化retrofit的时候注入即可)
- retrofit在项目开发中通常用于接口访问及其解析,但是不仅仅用于这些方面,retrofit的核心是callfactory和covertfactory项目开发中类似的场景都可以使用,比如说数据库数据获取及其解析,其他数据获取的场景貌似都可以使用。
- retrofit使用逻辑介绍
-
创建接口类,并在接口类中申明对应的接口api方法,同时注解的方式声明相对地址,header等接口必须属性。即:
retrofit接口声明* 项目中有许多接口。不需要每一个接口都有一个对应的声明接口类,极端情况可以只声明一个接口类和所有的接口api,通常建议按照项目模块划分接口类,将同一个模块的接口api放到同一个接口类中,这样可以方便维护。
* 接口api支持泛型,泛型数据通常就是接口访问结束获取数据并解析后的数据类。
* 接口声明注解还有很多,不在此处注解,详情参考下面第三个章节。 -
创建retrofit示例,配置基本url,数据转换器等,即:
retrofit创建* 通常项目中接口的配置都是一致的,所以这个创建也不需要每个对应一个,做简单的封装复用即可,需要注意的是可能接口对应的响应数据转换器不一样,可以根据数据转换器创建多个retrofit对象使用。
* retrofit提供的转换器包括(工厂模式,基调已定,没有提供转换可以实现转换工厂抽象类自己实现转换器即可,比如fastjson转换器等): retrofit转换器
-
利用上面创建的retrofit示例通过反射等获取到最初的接口实例对象
创建接口对象* 具体的实现源码代码量不大,但是涉及到功能点比较多,反射,代理,抽象工厂模式,注解解析等,值得深入研究,鉴于当前时间问题,下面文章更多是对流程逻辑分析,可以参考:
-
接口对象调用方法获取到call示实例对象
根据上面的接口实例获取到对应的call对象 -
调用call接口方法execute()和enqueue()实现同步和异步调用直接获取到解析后的对象。
同步/异步调用* 发起同步或者异步调用,这块代码相对简单,接口访问直接交给okhttp去处理。
- retrofit注解使用说明(主要整理与retrofit的官网注解,其他使用时候在做补充)
-
接口请求协议,get接口参数,get批量参数注解:
get注解* 如注释,retrofit协议注解支持当前http的所有交互协议
* 接口地址是相对地址,和retrofit创建时候的baseurl拼接成接口的最终url地址,且接口后面可以直接添加查询参数。
* 接口相对地址可以传递变量参数,此时需要在接口api上定义对应的字段即注解path。
* 查询参数可以以hashmap的方式传递批量参数。 -
post参数传递:表单,url编码,文件表单参数
post参数注解* post都是以body方式传递参数,没有额外设置retrofit都是以requestbody方式实现,retrofit的扩展性很强,可以以covert的方式替换body的实现。
* body可以以对象的方式封装实现,也可以以field的方式单个单个声明,多数项目的上行参数和下行参数不一致,个人感觉下面的使用更多一些。 -
接口header的注解实现:
header注解实现* 定义接口api的时候可以单个/多个header参数写死,也可以单个/多个动态参数的方式传入。
- retrofit的使用经验总结:
- retrofit并不处理接口的访问,所以在接口post协议的时候,建议参数还是使用RequestBody而不是指定具体的字段key-value方式,因为RequestBody是okhttp的接口请求封装,表单还有文件都有其实现,还有就是接口请求参数通常都会进行签名控制,使用RequestBody比直接key-vaule更容易处理
- 针对接口请求header,retrofit已经支持,但是不好的是需要针对接口单个设置不存在统一设置,可以将header区分为共用header和单个接口header,共用还是建议使用okhttp的拦截器去处理,单个header建议使用注解去处理。
- retrofit不处理接口访问线程,针对Android处理了接口响应线程,所以针对接口访问线程还是需要外部(建议rxjava)或者okhttp的内部处理逻辑。接口响应逻辑retrofit是统一放到了UI线程中,在使用的时候需要注意。
参考文章:
retrofit官方文档
retrofit github地址
重拾Android之路:探究retrofit2.0
详解Retrofit2.0 公共参数(固定参数)
Android封装Retrofit2+OkHttp3+RxJava网络请求