You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Retrofit中校验登录接口返回的空列表或空返回值?

解决接口返回空数组[]时的判断问题

我明白你的困扰——你遇到的核心问题是Kotlin中空列表([])和null的本质区别。当接口返回[]时,response.body()给你的是一个空的List对象,而不是null,所以你之前用if(response != null)这类判断完全不起作用,因为空列表本身是一个合法的非空对象。

问题根源

在Kotlin里,List是一个引用类型,哪怕它的元素数量为0(也就是空数组),它依然是一个存在的对象,不等于null。所以你之前的if(post)或者if(post != null)都会判定为true,但实际上列表里没有任何用户数据,这就是为什么你的判断逻辑失效了。

正确的判断逻辑

我们需要分两步走:先确保请求本身成功,再判断返回的列表是否为空。这里给你修改后的代码:

val response: Call<List<UserData>> = service.userLogin(email, pass)
response.enqueue(object : Callback<List<UserData>> {
    override fun onResponse(call: Call<List<UserData>>, response: Response<List<UserData>>) {
        // 第一步:先判断请求是否成功(HTTP状态码2xx)
        if (response.isSuccessful) {
            val post = response.body()
            
            // 第二步:判断返回的列表是否为null,或者是否为空数组
            when {
                post == null -> {
                    // 处理请求成功但无返回体的情况
                    println("请求成功,但未返回任何数据")
                }
                post.isEmpty() -> {
                    // 这里就是你要的场景:返回空数组,说明用户不存在或密码不匹配
                    println("用户不存在或密码不匹配")
                    // 执行你的对应操作,比如提示用户、跳转页面等
                }
                else -> {
                    // 列表有数据,登录成功,处理用户信息
                    val userData = post.first() // 假设登录接口返回单个用户数据
                    println("登录成功,用户信息:$userData")
                    // 执行登录成功后的逻辑
                }
            }
        } else {
            // 请求失败,处理错误情况(比如400、500等状态码)
            println("登录请求失败,状态码:${response.code()}")
        }
    }

    override fun onFailure(call: Call<List<UserData>>, t: Throwable) {
        // 处理请求失败的情况(比如网络错误)
        println("登录请求出错:${t.message}")
    }
})

简化判断的小技巧

如果你想合并判断post为null或者为空数组的情况,可以用Kotlin提供的isNullOrEmpty()扩展函数:

if (post.isNullOrEmpty()) {
    // 处理body为null或空数组的情况(即用户不存在/密码不匹配)
} else {
    // 处理登录成功的情况
}

这样就能准确捕捉到你需要的场景,再也不会出现判断失效的问题了。

内容的提问来源于stack exchange,提问作者lalo hernanez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:47:47