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

