liangjingkanji / Net

Android 基于协程/OkHttp网络请求工具
http://liangjingkanji.github.io/Net/
MIT License
1.9k stars 214 forks source link

转换器空值问题 #191

Closed shenhuxi92 closed 1 year ago

shenhuxi92 commented 1 year ago

问题描述

当前我有如下 GSONConcert ` override fun 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 bodyString = response.body?.string() ?: return null
                return try {
                    //获取JSON中后端定义的错误码和错误信息
                    val json = JSONObject(bodyString)
                    val srvCode = json.getString(this.code)
                    //对比后端请求成功状态码
                    if (srvCode == success) {
                        //空数据时后端有时候会返回 null 字符
                        if (json.isNull(this.body)) {
                            null
                        }else {
                            json.getString(this.body).parseBody<R>(succeed)
                        }
                    } else {
                        //请求成功状态码匹配失败, 开始写入错误异常
                        val errorMessage = json.optString(message, NetConfig.app.getString(com.drake.net.R.string.no_error_message))
                        throw ResponseException(response, errorMessage, tag = srvCode) // 将业务错误码作为tag传递
                    }
                } catch (e: JSONException) { // 固定格式JSON分析失败直接解析JSON
                    bodyString.parseBody<R>(succeed)
                }
            }
            code in 400..499 -> throw RequestParamsException(response, code.toString()) // 请求参数错误
            code >= 500 -> throw ServerResponseException(response, code.toString()) // 服务器异常错误
            else -> throw ConvertException(response)
        }
    }
}`

例如有如下 JSON 字符串, { "message": "成功", "code": "000", "data": null } data 的值有可能为 null ,当 data 为 null 时我返回了一个 null 对象,转换器直接抛出了 com.drake.net.exception.ConvertException 异常。 按照我的理解,我在 data 为 null 时直接返回一个 null ,并没有通过 parseBody 方法进行格式转换,为什么还会触发 ConvertException 异常

期望行为

当返回 null 时,不会触发 ConvertException 异常,直接返回一个 空对象即可

如何复现

fork仓库并复现问题可以快速解决, 猜测只会让问题晦涩难懂, 耽误所有人时间

截图

异常堆栈信息或者手机截图/视频(拖拽到输入框即可上传)

版本

liangjingkanji commented 1 year ago

你需要更了解Kotlin的空可选类型, 在文档自定义转换器 开始就有提到转换器里面返回null场景

解决方法, 修改代码

val r = Post<Data?>().await()

你说返回一个空的对象, 转换器怎么new空对象? 更何况data class是不允许空构造函数的

liangjingkanji commented 1 year ago

别说返回null, 你返回Drawable/Bitmap任何对象都可以, 但是请自己在转换器里面处理好

转换器里面发生任何错误都算ConvertExceptionCancelExcetionNetException及其子类

AdminQQZ commented 3 months ago
 if (!json.getString("data").equals("null")) {
                            json.getString("data").parseBody<R>(kType)
                        } else {
                            // 处理空data字符解析
                            bodyString.parseBody<R>(kType)
                        }