【问题标题】:Handle empty body response from service处理来自服务的空正文响应
【发布时间】:2019-01-11 17:20:37
【问题描述】:

我试图通过 POST 调用向用户发送电子邮件的服务,正文总是返回空,我必须处理响应代码。 例如204 = 成功。

我想这样处理,但我没有成功

服务:

@POST("xxxxxx")
fun resendBankSlip(@Path("userId") userId: Int): Deferred<Response>

视图模型:

scope.launch {
        try {
            _loading.value = true
            val response = repository.sendEmail(userId)
            if (!response.isSuccessful) {
                _error.value = R.string.generic_error_message
            }
        } catch (e: Throwable) {
            _error.value = R.string.generic_error_message
        } finally {
            _loading.value = false
        }
    }

错误发生在val response = repository.sendEmail(userId)

例外:

java.lang.IllegalArgumentException: 'okhttp3.Response' is not a valid response body type. Did you mean ResponseBody?
for method EmailService.sendEmail

有什么想法吗?

【问题讨论】:

    标签: kotlin retrofit2 kotlinx.coroutines


    【解决方案1】:

    您可能将okhttp3.Responseretrofit.Response 混淆了。尝试在 API 响应中使用 retrofit2.Response 包装器,如下所示:

    @POST("xxxxxx")
    fun resendBankSlip(@Path("userId") userId: Int): Deferred<retrofit2.Response<Unit>>
    

    之后,您可以通过response.code() 轻松获取响应代码。

    还请注意,我将Unit 作为Response 的类型参数传递,因为您不需要正文。在其他情况下,您应该传递实际类型的响应正文。

    【讨论】:

    • 完美!谢谢
    • @sma6871 你是对的,在 Kotlin 中使用 Unit,在 Java 中使用 Void
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    相关资源
    最近更新 更多