在Net中转换器([Convert](https://github.com/liangjingkanji/Net/blob/master/kalle/src/main/java/com/yanzhenjie/kalle/simple/Converter.kt))负责数据解析的工作, 自定义转换器即实现Convert接口即可
- 数据解密
- 解析JSON
- 判断请求是否成功
## 创建转换器
一般情况我们可以直接继承[DefaultConvert](api/net/com.drake.net.convert/-default-convert/index.md)
=== "Gson"
```kotlin
class JsonConvert : DefaultConvert(code = "code", message = "msg", success = "200") {
override fun String.parseBody(succeed: Type): S? {
return Gson().fromJson(this, succeed)
}
}
```
=== "Moshi"
```kotlin
class JsonConvert : DefaultConvert(code = "code", message = "msg", success = "200") {
override fun String.parseBody(succeed: Type): S? {
return Moshi.Builder().build().adapter(succeed).fromJson(this)
}
}
```
- 请自己手动添加[Moshi](https://github.com/square/moshi)或者[Gson](https://github.com/google/gson)的依赖
- Moshi属于Kotlin上解析Json我比较推荐的一个解析库, 支持Kotlin默认值(Gson不支持)
## 设置转换器
转换器分为全局和单例, 单例可以覆盖全局的转换器, 一般情况下设置一个全局即可
=== "全局"
```kotlin hl_lines="2"
initNet("http://182.92.97.186/") {
converter(JsonConvert())
}
```
=== "单例"
```kotlin hl_lines="3"
scopeNetLife {
tv_fragment.text = Get("api"){
convert(JsonConvert())
}.await()
}
```
## 自定义转换器
[DefaultConvert](https://github.com/liangjingkanji/Net/blob/master/net/src/main/java/com/drake/net/convert/DefaultConvert.kt) 实际上也只是实现Convert接口的一个抽象类
!!! note "自定义转换器"
当你对DefaultConvert有更多需求或者功能扩展的话推荐参考DefaultConvert来实现Convert接口(直接复制DefaultConvert文件修改也行)
源码如下
```kotlin
abstract class DefaultConvert(
val success: String = "0",
val code: String = "code",
val message: String = "msg"
) : Converter {
override fun convert(
succeed: Type,
failed: Type,
request: Request,
response: Response,
result: Result
) {
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 String.parseBody(succeed: Type): S?
}
```
DefaultConvert对于的核心逻辑
1. 判断服务器错误码
1. 判断后端自定义错误码
1. 如果判断错误则创建一个包含错误信息的异常
1. 如果都判断成功则开始解析数据
根据需要你可以在这里加上常见的日志打印, 解密数据, 跳转登录界面等逻辑