浅谈Retrofit
这是一个悲伤的故事:对一个背井离乡的“孩子”来说,被公司拖了2个月工资不发是什么样的感受。。。
算了,不多说了,还是言归正传吧。。。(还是再说一下吧 Retrofit是我在新公司开始使用的,也是小顺子同学推荐的,下面跟大家说一下我对它的使用和了解 害羞(✿‿),滴滴滴 发车 发车。。。。)
这是源码接:https://github.com/square/retrofit
这是官方文档:http://square.github.io/retrofit/
旧版我没有接触过,我直接用的是Retrofit2.0版本的。。
介绍一下设置吧:
1.网络权限 (不要忘了哦)
2.我使用As开发的(截图是我用到的Retrofit配置路径)
Eclipse用户的话 下载最新的jar包,当然Retrofit必须使用okhttp请求了,okhttp内部依赖okio所以都要添加。这个是jar包链接
终于到该介绍使用了,大家肯定觉得我好啰嗦,好吧,我承认了 哈哈
Retrofit2.0的使用:
1,创建Retrofit
解释一下BaseRequest什么鬼,因为工程比较小,我把整个工程Api接口模块分为User模块 和Order模块(下图是interface userApi 中的登录(结合Rxjava写的请求接口))。
上图中
a):client中获得是处理过的OkHttp的client(我们这App网络方面要求做Cookie持久化 Https请求方式,当然也因为方便打开OkHttpLog日志)
b):baseUrl就是BaseUrl!!!!!
c):ConverterFactory中加入的是Gson Converter 因为我们服务器返回的是json格式数据也就是Retrofit结合Gson一起用,它会接收json 结果并解析成DAO
这里是Square提供的官方Converter modules列表。选择一个最满足你需求的。
Gson: com.squareup.retrofit:converter-gson
Jackson: com.squareup.retrofit:converter-jackson
Moshi: com.squareup.retrofit:converter-moshi
Protobuf: com.squareup.retrofit:converter-protobuf
Wire: com.squareup.retrofit:converter-wire
Simple XML: com.squareup.retrofit:converter-simplexml
你也可以通过实现Converter.Factoty接口来创建一个自定义的converter。然后使用addConverterFactory把它添加进来。
d):CallAdapterFactory中设置Retrofit和结合Rxjava的使用
如果你只想了解一下Retrofit的网络请求方式,那么我给你一个链接:我刚开始也是看这位大神的简书的介绍的
一段废话献给大家,嘿嘿...
如果你之前用过volley, async-http-lib, xUtils。但又想知道Retrofit优雅之处在哪这位大神介绍的很好了 我的理解就是“门面”好看当然优雅
2 一些坑和解决办法
a)首先是上传文件使用@Multipart可以进行文件上传,不同于表单提交@FormUrlEncoded就是使用@Part指定文件路径及类型
b) 当你一个页面要访问2次服务器 第一次返回的参数第二个接口需要用怎么办呢(我们登录之后每个接口都是这样,都是要先加密一段字符串把服务器返回的字符串放在下一个请求的接口中,不要问我为什么,因为我也不知道。。。后台要求的 如下图),当然使用Rxjava作为Retrofit回调适配器的同学就不难解决,有一个很优雅的解决办法Rxjava操作符fiatMap,如果你要多个嵌套的subscription不仅看起来很丑,难以修改,更严重的是它会破坏RxJava的特性,什么特性?
c) 使用Gson Converter的同学肯定会发现一个问题,服务器返回的正确json格式是这个样的 {"code":"0","msg":"正常","data":{"bankCards":[]}} 然而要是code值不等于0的时候(就是网络请求不正常的时候)返回的是{"code":"1","msg":"系统出错","data":“”}而且“有心”的同学都会用一个泛型类接受data数据 窝草。。。。这怎么办,data可能是空的可能是String 或者 Object 还有可能直接是集合,内部解析直接抛异常啊。所谓道高一尺魔高一丈,自然有解决方法。
设置ConverterFactory上面已经介绍了,你都有耐心看到这了默认你已经懂我的意思了 嘿嘿\\\\\\\\(^o^)/~,先分析一下默认的GsonConverter怎么写的, 由三个类组成:
GsonConverterFactory // GsonConverter 工厂类, 用来创建GsonConverter
GsonResponseBodyConverter // 处理ResponseBody
GsonRequestBodyConverter // 处理RequestBody
从名字就很容易看出每个类是干嘛的, GsonResponseBodyConverter这个类肯定是关键,就是对这个类进行处理
如上图,写一个只包含code 和 msg2个属性的HttpStatus实体类(在activity获取数据之前先截获json数据,code不是0就抛异常 把msg信息放进异常的Msg中 在代码中Rxjava subscribe操作符中设置Action1接口抛出异常的时候可以通过getMessage获取错误信息)和一个自定义异常类ResponseException。这样在你的Activity中获取json数据转成DAO时,错误信息就会抛出异常并可以获取。是不是很完美?不是。。因为还有一个坑 :你只能对ResponseBody读取一次 , 如果你调用了response.body().string()两次或者response.body().charStream()两次就会出现异常, 先调用string()再调用charStream()也不行.所以通常的做法是读取一次之后就保存起来,下次就不从ResponseBody里读取.
3 题外话
因为Rtrofit说白了就是给Okhttp的一层包装,前面说到我们的后台要求做Https请求 和 Cookie持久化,所以我对Okhttp进行了设置处理。 这里给大家介绍大神(hyman)做好的okhttp Utlis,大家有时间可以看看。。。
好了。。滴滴滴 终点站到了 大家下车了