【问题标题】:how to get response headers using Retrofit in Kotlin?如何在 Kotlin 中使用 Retrofit 获取响应标头?
【发布时间】:2021-08-07 07:47:03
【问题描述】:

您好,我正在使用改造和 rxjava2 进行异步处理

我必须在与服务器开发人员交谈时从标头中获取值。

但是,我不知道如何从我使用的方法中获取标题。我知道怎么从Call Response中获取,但是不知道怎么带header,因为使用的方法不一样。

我的改造 2 班

private val retrofit: Retrofit = Retrofit.Builder()
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .client(client())
        .baseUrl(serverIp)
        .build()

    val userApi: UserAPI = retrofit.create(UserAPI::class.java)

我的模型类

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

data class LoginRequest(
    val phone: String?,
    @SerializedName("gender")
    val gender: String?,
    @SerializedName("age")
    val age: String?,
    @SerializedName("email")
    val email: String?
)

data class UserResponse (
    override var status: Int,
    override var message: String,
    override var timestamp: String,
    var data: Data
) : CommonResponse() {
    data class Data(
        var username: String?,
        var token: String?
    )
}

我的视图模型 (rx)

addDisposable(
            model.loginBody(loginRequest)
                .subscribeOn(Schedulers.io())
                .subscribe({
                    _loginResult.postValue(it)
                }, {
                    Timber.d("response error, message : ${it.localizedMessage}")
                })
        )

我现在的情况如下。我需要登录后服务器返回的标头, 从okhttp日志可以看到,但是不知道具体的header怎么获取

【问题讨论】:

    标签: android kotlin retrofit


    【解决方案1】:

    要检索响应标头和其他有用信息,您可以使用 retrofit2 包中的 Response 类型。要使用此功能,请将登录方法的返回类型更改为 Single&lt;retrofit2.Response&lt;UserResponse&gt;&gt;

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

    现在在 ViewModel 中检索标题

    addDisposable(
                model.loginBody(loginRequest)
                    .subscribeOn(Schedulers.io())
                    .subscribe({
                         val headers = it.headers() // do something with headers
                         val data = it.body()
                        _loginResult.postValue(data)
                    }, {
                        Timber.d("response error, message : ${it.localizedMessage}")
                    })
            )
    

    【讨论】:

    • 谢谢,但在看到这个答案之前我以同样的方式解决了它,哈哈但是非常感谢mightyWOZ的回复
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 2019-10-26
    • 2016-03-14
    • 2016-11-03
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多