如何在 Retrofit(Kotlin)中获取响应状态?

3

我正在使用 Retrofit。使用 Kotlin。 我需要知道响应状态码。比如是200还是500。我该如何从响应中获取它?

我的Api类:

interface Api {
    @POST("user/code/check")
    fun checkSmsCode(@Body body: CheckCodeBody): Single<Response<Void>> }

这是我调用API的方式。但请注意,服务器响应中不返回代码字段!
api.checkSmsCode(
   CheckCodeBody(
       code = code
   )
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({         
      //HOW TO CHECK STATUS RESPONSE STATUS CODE HERE???
    }, 
    { e ->
        when (e) {
            is IOException -> view?.showNoNetworkAlert()
            else -> view?.invalidCodeError()
        }
     }
).also {}

据我所知,在Java中这是易如反掌的事情。

你只需要使用response.code()或类似的方法就可以了。但在Kotlin中该怎么做呢?


2
但是在 Kotlin 中如何实现呢?Retrofit 是一个 Java 库,而 Kotlin 可与 Java 互操作;因此,您需要执行与在 Java 中完全相同的操作。 - EpicPandaForce
1
你可以使用“it”这个词来访问它,确切地说是“it.code()”。 - r2rek
你不能直接在响应中使用response.code()吗? - Brent
服务器没有发送任何 code - Azizjon Kholmatov
我的意思是在响应体中。如果我没记错的话,Java不需要在响应体中包含代码。 - Azizjon Kholmatov
显示剩余7条评论
3个回答

0

所以你的响应应该看起来像这样

      override fun onResponse(call: Call<MyModel>?, response: Response<MyModel>?) {
           //
      }
 })

然后在其中你应该只需要能够做到

      override fun onResponse(call: Call<MyModel>?, response: Response<MyModel>?) {
           response.code()
      }
 })

这是你谈论的内容吗?


修改了问题,请查看! - Azizjon Kholmatov

0
如果您没有配置Retrofit请求方法以返回Response<*>,则无法获得响应代码。例如:
interface SomeApi{
 @POST("user/code/check")
fun checkSmsCode(@Body body: CheckCodeBody): Single<Response<String>> 
}

当您完成请求后:

.subscribe({
 //access response code here like : it.code()
 //and you can access the response.body() for your data
 //also you can ask if that response.isSuccessful
})

修改了问题,请查看先生! - Azizjon Kholmatov
Single<Response<String>> 替换 Single<BaseResult<String>>。不用担心结果,Retrofit 会为你处理它。 - coroutineDispatcher
尝试了你的建议。没有帮助。:( - Azizjon Kholmatov

0

你需要使用它

interface OnlineStoreService{

    @Headers("Content-Type: application/json","Connection: close")
    @POST
    fun getDevices(
            @Url url: String,
            @Header("Authorization") token: String,
            @Body apiParams: APIParams
    ): Observable<OnlineStoresInfo>

} 


.subscribe({ onlineStoresInfo ->   // or it -> where "it" it's your object response, in this case is my class OnlineStoresInfo

                    loading.value = false
                    devices.value = onlineStoresInfo.devices

                }, { throwable ->
                    Log.e(this.javaClass.simpleName, "Error getDevices ", throwable)
                    loading.value = false
                    error.value = context.getString(R.string.error_information_default_html)
                })

.subscribe({ it -> 
// code
}, { throwable ->
 //code
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接