如何在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
相关产品推荐
相关产品推荐

