当前位置:   article > 正文

Retrofit+Moshi+Kotlin 如何网络请求中的业务异常_retrofit moshi

retrofit moshi

Moshi是square开源的一款JSON解析工具,有文章分析其和kotlin很搭且性能非常优秀,但对此我们并没有很深刻的理解,但是其API的易用性还是很不错的,用Gson作为解析工具的时候,一直有一个问题,如果json字符串中有一个字段类型匹配不上就会报错,这个时候如果想知道具体的结果就得手动解析,为什么不能在匹配不上的时候给默认值呢?Moshi则可以传入Adapter来自定义默认值,这对我们统一处理业务异常挺有用的。

先贴一下用法

这是创建Retrofit的地方,关键类是DefaultOnDataMismatchAdapter

  1. fun factory(): Retrofit {
  2. return Retrofit.Builder()
  3. .baseUrl(HttpConfig.baseUrl)
  4. .client(okHttpClientBuilder.build())
  5. .addConverterFactory(
  6. MoshiConverterFactory.create(
  7. Moshi.Builder()
  8. .add(DefaultOnDataMismatchAdapter.newFactory())
  9. .build()
  10. )
  11. )
  12. .build()
  13. }

这是DefaultOnDataMismatchAdapter的实现

  1. class DefaultOnDataMismatchAdapter<T>(val delegate: JsonAdapter<T>) : JsonAdapter<T>() {
  2. @Throws(IOException::class)
  3. override fun fromJson(reader: JsonReader): T? {
  4. val peeked = reader.peekJson()
  5. val result: T?
  6. try {
  7. var errorCode = -1
  8. var errorMsg = ""
  9. var errorCodeInit = false
  10. var errorMsgInit = false
  11. peeked.beginObject()
  12. while (peeked.hasNext()) {
  13. val nextName = peeked.nextName() ?: continue
  14. when (nextName) {
  15. "errcode" -> {
  16. errorCode = peeked.nextInt()
  17. errorCodeInit = true
  18. }
  19. "errmsg" -> {
  20. errorMsg = peeked.nextString()
  21. errorMsgInit = true
  22. }
  23. }
  24. if (errorCodeInit && errorMsgInit) {
  25. if (errorCode != 0) {
  26. //解析到errorCode不是0,业务返回异常,抛出异常让外界处理
  27. throw CustomerException(errorCode, errorMsg)
  28. }
  29. break
  30. }
  31. }
  32. result = delegate.fromJson(reader)
  33. } catch (e: JsonDataException) {
  34. throw e
  35. } finally {
  36. peeked.close()
  37. }
  38. reader.skipValue()
  39. return result
  40. }
  41. @Throws(IOException::class)
  42. override fun toJson(writer: JsonWriter, value: T?) {
  43. delegate.toJson(writer, value)
  44. }
  45. class CustomerException(val errorCode: Int, val errorMsg: String) : IOException()
  46. companion object {
  47. fun newFactory(): Factory {
  48. return object : Factory {
  49. override fun create(
  50. requestedType: Type, annotations: Set<Annotation?>?, moshi: Moshi
  51. ): JsonAdapter<*>? {
  52. //nextAdapter是系统提供的默认解析器,自定义的解析器最终也是用这个来解析的
  53. val delegate: JsonAdapter<Any?> =
  54. moshi.nextAdapter(this, requestedType, annotations)
  55. return if (requestedType.toString().contains("ApiResponse")) {
  56. //如果发现要解析ApiResponse,就用我们自己的Adapter
  57. DefaultOnDataMismatchAdapter(delegate)
  58. } else {
  59. //返回null 表示这个Factory不处理该类型的解析
  60. null
  61. }
  62. }
  63. }
  64. }
  65. }
  66. }

retrofit+Gson也有自己处理业务异常的方式,但是因为Gson的Api不兼容默认类型,所以是在ConvertorFactory中做处理的,相对而言,Moshi这种用Adapter的方式去处理更加灵活且优雅一些

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/886962
推荐阅读
相关标签
  

闽ICP备14008679号