NetHttpManager.kt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. package com.grkj.iscs.util
  2. import android.content.Context
  3. import android.util.Log
  4. import cn.zhxu.okhttps.HTTP
  5. import cn.zhxu.data.Mapper
  6. import cn.zhxu.okhttps.HttpResult
  7. import cn.zhxu.okhttps.HttpTask
  8. import cn.zhxu.okhttps.OkHttps
  9. import cn.zhxu.okhttps.gson.GsonMsgConvertor
  10. import cn.zhxu.okhttps.okhttp.OkHttpClientWrapper
  11. import com.grkj.iscs.model.Constants
  12. import com.grkj.iscs.model.Token
  13. import okhttp3.logging.HttpLoggingInterceptor
  14. import java.io.IOException
  15. import java.net.SocketTimeoutException
  16. class NetHttpManager {
  17. lateinit var myHttp: HTTP
  18. var context: Context? = null
  19. var exceptionCount: Int = 0
  20. companion object {
  21. fun getInstance() = InstanceHelper.sSingle
  22. val tagAuth = "Auth"
  23. }
  24. object InstanceHelper {
  25. val sSingle = NetHttpManager()
  26. }
  27. fun initCtx(ctx: Context) {
  28. context = ctx
  29. myHttp = HTTP.builder()
  30. .addMsgConvertor(GsonMsgConvertor())
  31. .baseUrl(Constants.BASE_URL)
  32. .responseListener { task: HttpTask<*>?, result: HttpResult? ->
  33. if (result?.status != 200) {
  34. // LogUtil.d(
  35. // "Api fail : Url : ${task?.url}, " +
  36. // "Status : ${result?.status}, " +
  37. // "Params : ${task?.urlParas ?: task?.bodyParas}"
  38. // )
  39. }
  40. true
  41. }
  42. .config {
  43. it.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
  44. }
  45. .addSerialPreprocessor { itPreChain ->
  46. if (!itPreChain.task.isTagged(tagAuth)) {
  47. itPreChain.proceed()
  48. return@addSerialPreprocessor
  49. }
  50. requestTokenAndRefreshIfExpired {
  51. itPreChain.task.addHeader("Access-Token", it)
  52. itPreChain.proceed()
  53. }
  54. }
  55. .build()
  56. }
  57. /**
  58. * 获取TOKEN,若过期则刷新(代码中的字符串可以替换为常量)
  59. */
  60. fun requestTokenAndRefreshIfExpired(callback: (String?) -> Unit) {
  61. val token = Token.fromSp(context!!)
  62. if (token == null) {
  63. // doLogin(callback)
  64. return
  65. }
  66. if (token.isValid()) {
  67. callback(token.accessToken)
  68. return
  69. }
  70. // 访问令牌已过期,刷新令牌未过期,则调接口刷新当前令牌
  71. // myHttp.async(TOKEN_REFRESH)
  72. myHttp.async("/app-api/member/auth/refresh-token")
  73. .skipPreproc() // 跳过所有预处理器
  74. .addBodyPara("refreshToken", token.refreshToken)
  75. .nextOnIO()
  76. .setOnResponse { res: HttpResult ->
  77. exceptionCount = 0
  78. if (!res.isSuccessful) {
  79. // doLogin(callback)
  80. return@setOnResponse
  81. }
  82. try {
  83. val newToken = res.body.toBean(Token::class.java)
  84. newToken.saveToSp(context!!)
  85. callback(newToken.accessToken)
  86. } catch (e: Exception) {
  87. // doLogin(callback)
  88. return@setOnResponse
  89. }
  90. }
  91. .setOnException { e: IOException ->
  92. evictHttpConnectPool(e)
  93. // doLogin(callback)
  94. }
  95. .post()
  96. }
  97. // private fun doLogin(callback: (String?) -> Unit) {
  98. // myHttp.async(SIGN_IN)
  99. // .skipPreproc()
  100. // .addBodyPara("username", "IPC")
  101. // .addBodyPara("password", "123456")
  102. // .nextOnIO()
  103. // .setOnResponse {
  104. // exceptionCount = 0
  105. // if (!it.isSuccessful) {
  106. // callback(null)
  107. // return@setOnResponse
  108. // }
  109. // try {
  110. // val newToken = it.body.toBean(Token::class.java)
  111. // newToken.saveToSp(context!!)
  112. // callback(newToken.accessToken)
  113. // } catch (e: Exception) {
  114. // callback(null)
  115. // return@setOnResponse
  116. // }
  117. // }
  118. // .setOnException {
  119. // evictHttpConnectPool(it)
  120. // callback(null)
  121. // }
  122. // .post()
  123. // }
  124. fun doRequestNet(
  125. urlStr: String, isSkipPreproc: Boolean,
  126. bodyParas: Map<String, *>,
  127. callback: (HttpResult.Body?, String?, Int) -> Unit,
  128. isGet: Boolean, isAuth: Boolean,
  129. mapperCallBack: ((Mapper) -> Unit)? = null
  130. ) {
  131. var httpTask = myHttp.async(urlStr).setOnException {
  132. evictHttpConnectPool(it)
  133. // callback(null, context?.getString(R.string.common_net_dis), 0)
  134. callback(null, "haha", 0)
  135. }
  136. if (isAuth) httpTask.tag(tagAuth)
  137. if (isSkipPreproc) {
  138. httpTask.skipPreproc()
  139. }
  140. httpTask.nextOnIO()
  141. .setOnResponse {
  142. exceptionCount = 0
  143. if (it.isSuccessful) {
  144. // Log.i("wtf1", it.body.toString())
  145. callback(it.body, null, it.status)
  146. } else {
  147. var bobyStr = it.body.toString()
  148. callback(
  149. null, if (bobyStr.isNullOrEmpty()) {
  150. it.toString()
  151. } else {
  152. bobyStr
  153. }, it.status
  154. )
  155. }
  156. }
  157. .setOnException {
  158. evictHttpConnectPool(it)
  159. // callback(null, context?.getString(R.string.common_net_dis), 0)
  160. callback(null, "xixi", 0)
  161. Log.i("wtf2", it.toString())
  162. }
  163. mapperCallBack?.let {
  164. httpTask.setOnResMapper {
  165. mapperCallBack.invoke(it)
  166. }
  167. }
  168. // .setOnResMapper {
  169. // mapperCallBack?.invoke(it)
  170. // }
  171. if (isGet) {
  172. httpTask.addUrlPara(bodyParas)
  173. httpTask.get()
  174. } else {
  175. httpTask.addBodyPara(bodyParas)
  176. httpTask.post()
  177. }
  178. }
  179. fun downloadFileWithProcess(
  180. url: String,
  181. downloadCallBack: DownloadCallBack,
  182. filePath: String? = null,
  183. folderPath: String? = null
  184. ) {
  185. try {
  186. if (filePath.isNullOrBlank() && folderPath.isNullOrBlank()) {
  187. downloadCallBack.onResult(
  188. false,
  189. // errorMsg = context?.getString(R.string.common_download_erro_notag)
  190. errorMsg = "lala"
  191. )
  192. return
  193. }
  194. OkHttps.async(url).setOnResponse {
  195. exceptionCount = 0
  196. if (it.isSuccessful) {
  197. if (filePath != null && filePath.isNotEmpty()) {
  198. it.body
  199. .stepRate(0.01)
  200. .setOnProcess {
  201. downloadCallBack.onProcess(it)
  202. }
  203. .toFile(filePath)
  204. .setOnSuccess {
  205. downloadCallBack.onResult(true, file = it)
  206. }
  207. .setOnFailure {
  208. downloadCallBack.onResult(false, errorMsg = it.exception.toString())
  209. }.start()
  210. } else if (folderPath != null && folderPath.isNotEmpty()) {
  211. it.body
  212. .stepRate(0.01)
  213. .setOnProcess {
  214. downloadCallBack.onProcess(it)
  215. }
  216. .toFolder(folderPath)
  217. .setOnSuccess {
  218. downloadCallBack.onResult(true, file = it)
  219. }
  220. .setOnFailure {
  221. downloadCallBack.onResult(false, errorMsg = it.exception.toString())
  222. }.start()
  223. }
  224. } else {
  225. downloadCallBack.onResult(
  226. false,
  227. it.status,
  228. // errorMsg = context?.getString(R.string.common_net_download)
  229. errorMsg = "dd"
  230. )
  231. }
  232. }.setOnException {
  233. evictHttpConnectPool(it)
  234. downloadCallBack.onResult(
  235. false,
  236. // errorMsg = context?.getString(R.string.common_net_download)
  237. errorMsg = "qq"
  238. )
  239. }.get()
  240. } catch (e: Exception) {
  241. downloadCallBack.onResult(false, errorMsg = e.message)
  242. }
  243. }
  244. private fun evictHttpConnectPool(e: Exception) {
  245. try {
  246. if (e is SocketTimeoutException) {
  247. exceptionCount += 1
  248. if (exceptionCount >= 5) {
  249. exceptionCount = 0
  250. (myHttp as OkHttpClientWrapper).okClient().connectionPool().evictAll()
  251. }
  252. } else {
  253. exceptionCount = 0
  254. }
  255. } catch (e: Exception) {
  256. }
  257. }
  258. }