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

如何在Kotlin中使用Retrofit结合RxJava2获取接口响应头

解决方案

1. 修改API接口定义

将原有接口的返回值从Single<UserResponse>调整为Single<retrofit2.Response<UserResponse>>,通过Retrofit官方提供的Response包装类,即可同时获取响应头、响应状态码、业务响应体三类数据。
修改后的接口代码:

@POST("user")
fun login(
    @Body loginRequest : LoginRequest
) : Single<retrofit2.Response<UserResponse>>

注意:不要导错包,需要引入的是retrofit2.Response,而非okhttp3的Response类。

2. 调整ViewModel中的订阅逻辑

修改原有RxJava订阅代码,从返回的Response对象中提取响应头和业务数据即可:

addDisposable(
    model.loginBody(loginRequest)
        .subscribeOn(Schedulers.io())
        .subscribe({ response ->
            // 提取指定响应头,示例为获取Set-Cookie字段,替换为你需要的字段名即可
            val headerValue = response.headers()["你需要的响应头字段名"]
            // 若要获取同key多值的响应头(比如多个Set-Cookie),可使用values方法
            // val cookieList = response.headers().values("Set-Cookie")
            Timber.d("提取到的目标响应头值:$headerValue")

            // 原有业务逻辑保留,先判断请求成功再读取响应体
            if (response.isSuccessful) {
                response.body()?.let { userResponse ->
                    _loginResult.postValue(userResponse)
                }
            } else {
                Timber.d("请求异常,响应码:${response.code()}")
            }
        }, {
            Timber.d("response error, message : ${it.localizedMessage}")
        })
)

额外说明

  • response.headers()返回的Headers对象可调用toMultimap()方法获取所有响应头的键值对集合,方便批量遍历
  • 响应头的key为大小写不敏感,传token和Token都可以正确匹配到对应值
  • 原有Retrofit初始化逻辑不需要做任何改动,RxJava2CallAdapterFactory原生支持返回Response包装的Rx类型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:54:00