在Net中转换器(Convert)负责数据解析的工作, 自定义转换器即实现Convert接口即可
一般情况我们可以直接继承DefaultConvert
=== "Gson"
```kotlin
class JsonConvert : DefaultConvert(code = "code", message = "msg", success = "200") {
override fun <S> String.parseBody(succeed: Type): S? {
return Gson().fromJson(this, succeed)
}
}
```
=== "Moshi"
```kotlin
class JsonConvert : DefaultConvert(code = "code", message = "msg", success = "200") {
override fun <S> String.parseBody(succeed: Type): S? {
return Moshi.Builder().build().adapter<S>(succeed).fromJson(this)
}
}
```
转换器分为全局和单例, 单例可以覆盖全局的转换器, 一般情况下设置一个全局即可
=== "全局"
```kotlin hl_lines="2"
initNet("http://182.92.97.186/") {
converter(JsonConvert())
}
```
=== "单例"
```kotlin hl_lines="3"
scopeNetLife {
tv_fragment.text = Get<String>("api"){
convert(JsonConvert())
}.await()
}
```
DefaultConvert 实际上也只是实现Convert接口的一个抽象类 !!! note "自定义转换器"
当你对DefaultConvert有更多需求或者功能扩展的话推荐参考DefaultConvert来实现Convert接口(直接复制DefaultConvert文件修改也行)
源码如下
abstract class DefaultConvert(
val success: String = "0",
val code: String = "code",
val message: String = "msg"
) : Converter {
override fun <S, F> convert(
succeed: Type,
failed: Type,
request: Request,
response: Response,
result: Result<S, F>
) {
val body = response.body().string()
val code = response.code()
when {
code in 200..299 -> { // 服务器错误码为200-299时为成功
val jsonObject = JSONObject(body)
if (jsonObject.getString(this.code) == success) { // 对比后端返回的自定义错误码
result.success =
if (succeed === String::class.java) body as S else body.parseBody(succeed)
} else {
// 如果不匹配后端自定义错误码则认为请求失败, [result.failure]写入错误异常, 会自动吐司出该信息
result.failure =
ResponseException(code, jsonObject.getString(message), request) as F
}
}
code in 400..499 -> throw RequestParamsException(code, request) // 请求参数错误
code >= 500 -> throw ServerResponseException(code, request) // 服务器异常错误
}
}
abstract fun <S> String.parseBody(succeed: Type): S?
}
DefaultConvert对于的核心逻辑
根据需要你可以在这里加上常见的日志打印, 解密数据, 跳转登录界面等逻辑