Jelajahi Sumber

sample: 新增protobuf转换器

drake 2 tahun lalu
induk
melakukan
6802ed7363

+ 5 - 4
sample/build.gradle

@@ -91,11 +91,12 @@ dependencies {
 
 
     // ------------------------------JSON解析-------------------------------------
-    implementation "com.squareup.moshi:moshi-kotlin:1.8.0"
+    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" // JSON序列化库, 首选推荐使用
+    implementation "org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.2.0"  // protobuf序列化
+    implementation "com.squareup.moshi:moshi-kotlin:1.8.0" // JSON序列化库, 强校验, JSON字段缺失会导致解析异常, 故不推荐
     kapt "com.squareup.moshi:moshi-kotlin-codegen:1.8.0"
-    implementation 'com.google.code.gson:gson:2.8.6'
-    implementation 'com.alibaba:fastjson:1.2.73'
-    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2"
+    implementation 'com.google.code.gson:gson:2.8.6' // JSON序列化库, 会导致kotlin默认值无效, 故不推荐
+    implementation 'com.alibaba:fastjson:1.2.73' // JSON序列化库, 会导致kotlin默认值无效(除非引入kt-reflect), 不推荐
 
     // ------------------------------其他库-------------------------------------
     implementation 'com.github.liangjingkanji:StatusBar:2.0.2' // 透明状态栏

+ 34 - 0
sample/src/main/java/com/drake/net/sample/converter/ProtobufConverter.kt

@@ -0,0 +1,34 @@
+@file:Suppress("UNCHECKED_CAST", "MemberVisibilityCanBePrivate")
+
+package com.drake.net.sample.converter
+
+import com.drake.net.convert.NetConverter
+import com.drake.net.exception.ConvertException
+import com.drake.net.exception.RequestParamsException
+import com.drake.net.exception.ServerResponseException
+import com.drake.net.request.kType
+import kotlinx.serialization.protobuf.ProtoBuf
+import kotlinx.serialization.serializer
+import okhttp3.Response
+import java.lang.reflect.Type
+
+class ProtobufConverter : NetConverter {
+
+    override fun <R> onConvert(succeed: Type, response: Response): R? {
+        try {
+            return NetConverter.onConvert<R>(succeed, response)
+        } catch (e: ConvertException) {
+            val code = response.code
+            when {
+                code in 200..299 -> { // 请求成功
+                    val bytes = response.body?.bytes() ?: return null
+                    val kType = response.request.kType ?: throw ConvertException(response, "Request does not contain KType")
+                    return ProtoBuf.decodeFromByteArray(ProtoBuf.serializersModule.serializer(kType), bytes) as R
+                }
+                code in 400..499 -> throw RequestParamsException(response, code.toString()) // 请求参数错误
+                code >= 500 -> throw ServerResponseException(response, code.toString()) // 服务器异常错误
+                else -> throw ConvertException(response)
+            }
+        }
+    }
+}