Retrofit三步理解之二 ------------------ Retrofit的进一步总结

来源:互联网 发布:linux开发入门 编辑:程序博客网 时间:2024/06/01 10:17
距离上一次的Retrofit的总结已经一个月过去了,现在Retrofit版本已经到2.0.0-beta3,okhttp也变成了okhttp3,最新版本有各自的相互依赖,例如retrofit2不能再使用okhttp,而是使用okhttp3。API并没有太大变化,使用方式上,也并没有实质性的变化,当然和retrofit1.*版本来说还是不同的。
     以前并没有搞懂网络请求这一块,经过2-3周的锤炼,天天都要跟网络请求打交道,现在对网络请求有了更深入的理解。
概念:
     (1) Retrofit实际上只是对okhttp的封装,底层实质上并没有什么变化,它的作用就是使用面向接口的方式进行网络请求。利用动态生成代理类的方式,封装了网络请求接口的底层,在使用者看来只有接口类,而且自己并没有对其写任何实现。这就是retrofit的核心所在。
     (2) 网络请求复杂多样,retrofit提供的方法并不能完全解决所有问题,如果需要更复杂的操作,那么仍然需要依赖okhttp。
1. 分类
     实际上在现实中一般只使用GET和POST请求,当然retrofit也支持DELETE, PUT, HEAD...
     在工作中,也一般只有四种需求:get获取字符串数据(get json/xml…),提交键值对(post form data),下载文件,上传文件(同时需要上传一些键值对,多文件上传)
2. 深入探讨retrofit对上面几种的实现
     (1) 获取字符串数据:
     在接口方法中,我们需要指定其请求方式为GET,同时设置请求地址(相对或绝对地址),然后在参数中添加@Query或QueryMap注解。除了一些细节可以在后面讨论,实际上并没有任何难度。
     
     (2) 提交键值对
     在接口方法中,指定请求方式为GET,同时设置请求地址(相对或绝对地址),然后在参数中添加@Field或@FieldMap注解。同时,如果我们不再处理,实际上其方式就是FormUrlEncoded,那么我们最好仍然指定方法为@FormUrlEncoded
     
     (3) 下载文件
     Retrofit并没有直接提供下载文件的方式,而且也可以使用retrofit来下载文件,但是不提倡。使用方式跟(1)一样,在Call中进行处理即可。
     (4) 上传文件
     上传文件一直是一个比较难理解的点。
     概念:上传文件使用的方式是POST, 需要指定content-type为multipart/form-data(目前遇到的所有网络请求都是这样,当然还有multipart/fix... 也并不了解是否还可以使用其他的方式,但是工作中一般都是使用form-data),上传文件的同时也会上传一些键值对。对于Retrofit的文件,并没有对okhttp进行太大的封装,很多工作仍然需要自己完成。
     // TODO 并没有测试,所以这里也暂时不写
3. 其他知识点
     下图是retrofit的所有注解。
DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT 都是请求方式。
Query, QueryMap和 GET结合使用
Field, FieldMap, Body(Converter处理) 与FormUrlEncoded和POST结合使用
Part, PartMap 与 Multipart和POST结合使用
另:
Header 修饰参数,动态确定Header值
Headers 修饰方法,固定Header值
HTTP可以代替所有请求方式,例如:@HTTP(method = POST, path = “user/info")
Path 修饰参数,动态生成path
Url 修饰参数,动态指定path
Streaming 修饰方法,没有使用过,源码解释大概意思是直接返回Response对象,不再使用Converter进行处理。


4. 问题
     在Retrofit中使用有一个概念困扰着我:Converter,这是一个让请求结果和返回结果进行处理的接口。我们也只是使用其将返回结果gson数据转换成pojo。但是其中需要将请求也进行处理,而且可以指定多个Converter,现在也并不了解其中对于Converter的筛选机制。

0 0
原创粉丝点击