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

使用Kotlin Flow+Retrofit实现顺序执行登录、更新接口请求示例

实现前提

我们先统一定义通用返回结构BaseResponse,包含业务成功状态判断逻辑,你可以根据实际业务规则调整判断条件:

// 通用接口返回基类
data class BaseResponse<T>(
    val code: Int,
    val message: String,
    val data: T? = null
) {
    // 自定义请求成功的判断规则,示例为code等于200即代表成功
    val isSuccess: Boolean get() = code == 200
}

// 你的两个suspend接口示例定义
suspend fun login(): BaseResponse<Unit> {
    // 此处为登录接口的实际请求逻辑
}
suspend fun update(): BaseResponse<String> {
    // 此处为更新接口的实际请求逻辑
}
核心Flow实现代码
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.flow

fun loginThenUpdate(): Flow<BaseResponse<*>> = flow {
    // 1. 调用login接口,等待返回结果
    val loginResult = login()
    // 2. 校验login返回是否成功
    if (!loginResult.isSuccess) {
        // 登录校验失败直接返回登录结果,不执行后续逻辑
        emit(loginResult)
        return@flow
    }
    // 3. 校验通过后执行update接口
    val updateResult = update()
    // 4. 发射update的返回结果
    emit(updateResult)
}.catch { e ->
    // 5. 捕获请求过程中抛出的异常,统一封装为错误返回,不会执行后续接口
    emit(BaseResponse(code = -1, message = e.message ?: "请求发生未知错误"))
}
调用示例
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.runBlocking

fun main() = runBlocking {
    loginThenUpdate().collect { result ->
        // 最终拿到的结果:要么是登录错误/异常,要么是update接口的返回
        if (result.isSuccess) {
            println("请求成功,数据:${result.data}")
        } else {
            println("请求失败,原因:${result.message}")
        }
    }
}
逻辑说明
  • 完全符合需求的执行顺序:登录请求完成后才会走校验,校验通过才会执行更新接口
  • 登录校验失败、登录过程抛异常都会直接返回错误,不会触发更新接口的调用
  • 整个流为冷流,只有调用collect的时候才会真正发起接口请求
  • 所有运行异常都会被catch操作符捕获,不会导致程序崩溃

内容的提问来源于stack exchange,提问作者Mahmoud Ayman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:08