retrofit介绍
Retrofit是什么
简单的说它是一个基于OkHttp的RESTFUL Api请求工具,从功能上来说和Google的Volley功能上很相似,但是使用上很不相似。
Retrofit可以让你简单到调用一个Java方法的方式去请求一个api,这样App中的代码就会很简洁方便阅读
retrofit的好处:
① Retrofit使用注解方式,大大简化了我们的URL拼写形式,而且注解含义一目了然,简单易懂;
② Retrofit使用简单,结构层次分明,每一步都能清晰的表达出之所以要使用的寓意;
④ Retrofit支持同步和异步执行,使得请求变得异常简单,只要调用enqueue/execute即可完成;
④ Retrofit更大自由度的支持我们自定义的业务逻辑,如自定义Converters。
Retrofit怎么用
比如你要请求这么一个api,
http://139.199.89.89/api/v1/books
首先,你需要创建一个Retrofit
对象,并且指定api的域名:
1 2 3 4 |
|
其次,你要根据api新建一个Java接口,用Java注解来描述这个api
1 2 3 4 |
|
再用这个retrofit
对象创建一个BookService
对象:
Call<BookResponse> call = service.getResult();
这样就表示你要请求的api是http://139.199.89.89/api/v1/books
最后你就可以用这个call
对象获得数据了,enqueue
方法是异步发送http请求的,如果你想用同步的方式发送可以使用execute()
方法,call
对象还提供cancel()
、isCancel()
等方法获取这个Http请求的状态
1 2 3 4 5 6 7 8 9 10 11 |
|
Retrofit
只要创建一个接口来描述Http请求,然后可以让我们可以像调用Java方法一样请求一个Api
Retrofit的原理
从上面Retrofit的使用来看,Retrofit就是充当了一个适配器(Adapter)的角色:将一个Java接口翻译成一个Http请求,然后用OkHttp去发送这个请求**
Volley描述一个HTTP请求是需要创建一个Request
对象,而执行这个请求呢,就是把这个请求对象放到一个队列中,在网络线程中用HttpUrlConnection
去请求
问题来了:
Retrofit是怎么做的呢?
答案很简单,就是:Java的动态代理
动态代理
Call<BookResponse> call = service.getResult();
我给Retrofit对象传了一个BookService
接口的Class对象,怎么又返回一个BookService
对象呢?进入create
方法一看,没几行代码,但是我觉得这几行代码就是Retrofit的精妙的地方:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
create
方法就是返回了一个Proxy.newProxyInstance
动态代理对象。那么问题来了...
动态代理是个什么东西?
看Retrofit代码之前我知道Java动态代理是一个很重要的东西,比如在Spring框架里大量的用到,但是它有什么用呢?
Java动态代理就是给了程序员一种可能:当你要调用某个Class的方法前或后,插入你想要执行的代码
比如你要执行某个操作前,你必须要判断这个用户是否登录,或者你在付款前,你需要判断这个人的账户中存在这么多钱。这么简单的一句话,我相信可以把一个不懂技术的人也讲明白Java动态代理是什么东西了。
为什么要使用动态代理
你看上面代码,获取数据的代码就是这句:
1 |
|
上面api
对象其实是一个动态代理对象,并不是一个真正的BookService
接口的implements
产生的对象,当api
对象调用getResult
方法时会被动态代理拦截,然后调用Proxy.newProxyInstance
方法中的InvocationHandler
对象,它的invoke
方法会传入3个参数:
Object proxy: 代理对象,不关心这个
Method method:调用的方法,就是
getAuthor
方法Object... args:方法的参数,就是
"qinchao"
而Retrofit关心的就是method
和它的参数args
,接下去Retrofit就会用Java反射获取到getResult
方法的注解信息,配合args
参数,创建一个ServiceMethod
对象
ServiceMethod
就像是一个中央处理器,传入Retrofit
对象和Method
对象,调用各个接口和解析器,最终生成一个Request
,包含api 的域名、path、http请求方法、请求头、是否有body、是否是multipart等等。最后返回一个Call
对象,Retrofit2中Call接口的默认实现是OkHttpCall
,它默认使用OkHttp3作为底层http请求client
使用Java动态代理的目的就要拦截被调用的Java方法,然后解析这个Java方法的注解,最后生成Request由OkHttp发送
执行Http请求
之前讲到,OkHttpCall
是实现了Call
接口的,并且是真正调用OkHttp3
发送Http请求的类。OkHttp3
发送一个Http请求需要一个Request
对象,而这个Request
对象就是从ServiceMethod
的toRequest
返回的
总的来说,OkHttpCall
就是调用ServiceMethod
获得一个可以执行的Request
对象,然后等到Http请求返回后,再将response body传入ServiceMethod
中,ServiceMethod
就可以调用Converter
接口将response body转成一个Java对象
结合上面说的就可以看出,ServiceMethod
中几乎保存了一个api请求所有需要的数据,OkHttpCall
需要从ServiceMethod
中获得一个Request
对象,然后得到response后,还需要传入ServiceMethod
用Converter
转换成Java对象
你可能会觉得我只要发送一个HTTP请求,你要做这么多事情不会很“慢”吗?不会很浪费性能吗?
我觉得,首先现在手机处理器主频非常高了,解析这个接口可能就花1ms可能更少的时间(我没有测试过),面对一个HTTP本来就需要几百ms,甚至几千ms来说不值得一提;而且Retrofit会对解析过的请求进行缓存,就在Map<Method, ServiceMethod> serviceMethodCache = new LinkedHashMap<>();
这个对象中
Retrofit非常巧妙的用注解来描述一个HTTP请求,将一个HTTP请求抽象成一个Java接口,然后用了Java动态代理的方式,动态的将这个接口的注解“翻译”成一个HTTP请求,最后再执行这个HTTP请求
Retrofit的功能非常多的依赖Java反射,代码中其实还有很多细节,比如异常的捕获、抛出和处理,大量的Factory设计模式(为什么要这么多使用Factory模式?)
Retrofit中接口设计的恰到好处,在你创建Retrofit
对象时,让你有更多更灵活的方式去处理你的需求,比如使用不同的Converter
、使用不同的CallAdapter
,这也就提供了你使用RxJava来调用Retrofit的可能
我也慢慢看了Picasso和Retrofit的代码了,收获还是很多的,也更加深入的理解面向接口的编程方法,这个写代码就是好的代码就是依赖接口而不是实现最好的例子
好感谢开源的世界,让我能读到大牛的代码。我一直觉得一个人如果没有读过好的代码是不太可能写出好代码的。什么是好的代码?像Picasso和Retrofit这样的就是好的代码,扩展性强、低耦合、插件化
作者:nickcau
链接:https://www.imooc.com/article/274679
来源:慕课网
本文首次发布于慕课网 ,转载请注明出处,谢谢合作
retrofit介绍相关推荐
- 认证android retrofit,Retrofit之项目介绍
项目介绍 官网对retrofit介绍是这是一个"类型安全(type-safe)"的Android/Java http客户端. 目前retrofit的最新正式版本为1.9.0. 2. ...
- java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
Retrofit介绍: Retrofit和okHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,基于OkHtttp做了封装,解耦的更彻底:比 ...
- android http常用配置,Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
Retrofit介绍:Retrofit(GitHub主页https://github.com/square/okhttp)和OkHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库 ...
- Android 网络框架 Retrofit2.0介绍、使用和封装
前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...
- Retrofit2.0介绍使用封装
前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...
- 入门Retrofit,看这一篇就够了
文章目录 Retrofit介绍 基础使用步骤 添加依赖 声明网络权限 创建用于配置网络请求的接口 创建Retrofit实例并发起网络请求 Retrofit使用详解 请求方法 URL操作 请求体 标记注 ...
- Retrofit(一)
Retrofit(一) 一. Retrofit介绍 Retrofit基于Okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责网络请求接口的封装. 二 ...
- Retrofit 使用 一
前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...
- 渣硕自学两年转行Android,零经验春招拿美团30w年薪offer,HR说我是头一个!
前言 本人为某末流211工科硕士, 找工作时,经常在网上找资料学习.面经刷题,为回馈朋友们,写下这篇分享贴,也算是对我求学生涯的总结. 说来令人感慨,我的考研之路异常曲折,每次都觉得自己能十拿九稳,结 ...
- Retrofit-原理全解析
1.Retrofit介绍 Retrofit是一个RESTful的Http网络请求框架的封装,网络请求部分本质是由OKHttp完成的 而我们学习Retrofit除了对Http请求有进一步的了解之外,我们 ...
最新文章
- unity3d游戏开发猜想——当程序猿老去
- 防盗链技术底层实现原理分析
- 女生来大姨妈该怎么哄她?
- 从外网Thinkphp3日志泄露到杀入内网域控 - 红队攻击之域内靶机渗透实战演练
- phpcms函数:用*号替换(私密信息)中间数据(如手机号、邮箱)
- ArcGIS GeoDataBase GeoDataset dataset
- Pandas系列(六)SettingWithCopyWarning报警
- SQL学习笔记之游标
- 数据结构(C++版)- 教学视频+配套资源
- 深度Linux安装红警2,深度Deepin Linux v20 Beta下玩红警
- 前端开发者常见的英文单词汇总
- 统计分析用户信息量的工具Flurry的使用
- 鸿蒙系统屏幕录制,全屏幕录制可以隐藏选项窗口么
- BDC模式与OKCODE、 CALL TRANSACTION用法
- html5文本框获取焦点,CSS3实现文本输入框获取焦点高亮显示
- 教你彻底卸载MySQL 并重装(保姆级教程 )
- Linux学习134 Unit 5
- 常用的UML建模详解
- 2015百度面试题--对10亿个32位整数去重和排序
- php服务器默认首页,如何修改Apache服务器的默认首页?
热门文章
- 德赛西威Mib280D升级0393版本系统
- mt4虚拟服务器账户无效,外汇登录显示无效账户怎么办?
- DLNA实现本地媒体服务器
- 占书明:win7系统微信突然提示“微信运行错误:当前版本需在windows xp sp3以上系统运行,请安装可用版本或升级系统。点击确认下载安装可用版本”。
- 【我的新书】一步一步学SpringBoot 2:微服务项目实战
- android 记事本软件,安卓日历记事本软件
- 【python教程入门学习】拒绝反爬虫 教你爬虫验证码
- unable to resolve host address
- 【一句日历】2019年7月
- Elasticsearch:使用向量搜索来查询及比较文字 - NLP text embedding