Retrofit 的初步踩坑
android 的网络访问框架贼多。Retrofit 借群大佬说的一句话“安卓retrofit是设计最优秀的”。
由于 我之前使用的是廖大佬的 okgo ,但是 用kotlin 之后,感觉没有回调成功,自己又菜,没有找到为啥没有回调成功,又不想统一java 回调,然后决定 涉及下其他的。于是Retrofit 便成了目标之一。
http://square.github.io/retrofit/ 官网教程。
现在 google 一下到处都是这个教程。
集成方式:
api'com.squareup.retrofit2:retrofit:2.4.0'
然后 坑的是,如果不添加 string 运行时候会提示 错误,反正就是让你 再集成一个 api'com.squareup.retrofit2:converter-scalars:2.3.0' android 3.0 以上就用implementation 和api 了,api 有点像public 在lib 中集成了,app 中也可以调用 api 导入的lib. 具体有那些 可以添加的依赖 官方文档上写得很完整。
添加到gradle 中 之后。就可以开始搬砖了。
api'com.squareup.retrofit2:retrofit:2.4.0'
api'com.squareup.retrofit2:converter-gson:2.3.0'
// 字符串依赖(根据需要选择)
api'com.squareup.retrofit2:converter-scalars:2.3.0'
首先创建一个接口。比如这样:
因为是接口,所以所有的变量都是final 的,属于不可再次修改。
然后 写一个 单例或者什么的,返回一个 全局唯一的 server 对象。server 是Retofit 通过刚刚创建的接口生成的。 还有一件事,baseUrl必须是/ 结尾,如果设置了不是以/结尾 就会提示 报错。
以上 就是全部是准备工作了。就可以开始接接口了。
在之前 定义的接口 类中,用注解 开始 写接口什么的,
post 请求 就用 @post ,get 请求 就用@get ,
比如
因为是接口 接收是 post请求,所以我这边用的post 的表单提交,@FormUrlEncoded 表示 是表单提交,@Field 和@FormUrlEncoded 必须是一起使用的。
由于 翻译不当,没有注意就遇到了另外一个坑,比如这样的接口:http://192.168.5.21/app/user/feed-back?token=yxae82HH87jinQ_v-uHgZAQEafuZfgXt_1525658115 需要使用post请求,但是 我的token 需要使用get 请求拼接到url 后面,然后 就脑阔痛了。
其实 只需要 使用 @Query 注解 就可以把token 拼接到url 后面了,也不需要写什么其他的,传值的时候 字需要传递 token 的 值就好了,之前 还想过 通过@path 改变url 的结果发现 我?会被转码,传递到服务器 就不是?了。应该通过path 也行,但是 要、?不被转码才可以。
然后是使用:
response.toString() 可以打印出{protocol=http/1.1, code=200, message=OK, url=http://192.168.5.21/app/user/feed-back?token=yxae82HH87jinQ_v-uHgZAQEafuZfgXt_1525658115} 类型是信息
Response.body 返回的是在接口 中对应方法的返回值。如过接口中 定义的是call<user> 那么Response.body() 返回的就是user 对象。