NetHttpManager.kt 9.4 KB

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