【问题标题】:How to get response status in Retrofit (Kotlin)?如何在 Retrofit (Kotlin) 中获取响应状态?
【发布时间】:2019-06-18 13:41:04
【问题描述】:

我正在使用改造。使用科特林。我需要知道响应状态码。比如是 200 还是 500。我怎样才能从响应中得到它?

我的 Api 类:

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

这就是我调用 Api 的方式。但请注意,SERVE 不会在响应体中返回代码字段!

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 中实现呢?

【问题讨论】:

  • But how to achieve it in Kotlin? Retrofit 是一个 Java 库,Kotlin 与 Java 互操作;所以你需要做与 Java 完全相同的事情。
  • 好吧,这并不像看起来那么容易。事实证明,您无法从 Kotlin 访问这些内容。我不知道如何实现它。
  • 您可以使用it 字词访问它,确切地说是it.code()
  • @r2rek 它不工作。
  • 你如何定义checkSmsCode

标签: android kotlin retrofit


【解决方案1】:

所以你的响应应该是这样的

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

然后在里面你应该能够做到

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

你说的是这个吗?

【讨论】:

  • 编辑了问题。请先生看看!
【解决方案2】:

你需要使用它

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
})

【讨论】:

    【解决方案3】:

    如果您尚未将改造请求方法配置为返回 Response&lt;*&gt;,您将无法获得响应代码。示例:

    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
    })
    

    【讨论】:

    • 编辑了问题。请先生看看!
    • Single&lt;BaseResult&lt;String&gt;&gt; 替换为Single&lt;Response&lt;String&gt;&gt;。不要担心这样的结果。改造为您处理。
    • 尝试了您的建议。没有帮助。 : (
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2017-09-24
    • 2016-02-19
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多