返回

Kotlin 协程和 Retrofit 中的 204 无内容响应:如何优雅地处理?

Android

处理 Retrofit 中 Kotlin 协程的 204 无内容响应

前言

在使用 Retrofit 2.7.1 和 Kotlin 协程时,恰当处理 HTTP 204 无内容响应非常重要,因为它可以防止应用程序崩溃。这篇博文将探讨解决此类响应的多种方法,帮助你写出健壮且可靠的代码。

什么是 204 响应?

HTTP 204 无内容响应表明服务器已成功处理请求,但没有返回任何内容。这种响应通常用于确认更新或删除操作的成功,而不提供任何具体的数据。

为什么需要特殊处理?

默认情况下,Retrofit 无法处理 204 响应。尝试从 204 响应中提取数据可能会导致应用程序崩溃。因此,需要特殊处理来优雅地处理这些响应。

解决方案

有几种方法可以在 Retrofit 中处理 204 响应:

1. 使用 safeApiCall()

safeApiCall() 是一个实用函数,可将网络请求包装在一个 try-catch 块中,并处理 204 响应。它返回一个包装了请求结果的 Result 对象:

try {
    val result = safeApiCall { service.updateUserProfile(userId, displayName) }
    if (result.isSuccess) {
        // 处理成功的更新
    } else {
        // 处理错误或 204 响应
    }
} catch (e: Exception) {
    // 处理网络错误
}

2. 使用 ResponseBody

也可以使用 ResponseBody 来处理 204 响应。通过检查 ResponseBody 是否为空,你可以确定请求是否成功:

val response = service.updateUserProfile(userId, displayName)
if (response.body() != null) {
    // 处理成功的更新
} else {
    // 处理 204 响应
}

3. 创建自定义 CallAdapter

对于更高级别的控制,你可以创建自定义 CallAdapter 来处理 204 响应。这允许你完全自定义如何解析响应:

class NoContentCallAdapter<T> : CallAdapter<T, Void?> {
    override fun responseType() = Void::class.java
    override fun adapt(call: Call<Void?>): TypeAdapter<Void?> {
        return object : TypeAdapter<Void?>() {
            override fun fromJson(reader: JsonReader): Void? = null
            override fun toJson(writer: JsonWriter, value: Void?) {}
        }
    }
}

结论

处理 Retrofit 中的 204 无内容响应对于编写健壮的 Kotlin 协程网络代码至关重要。本文提供了多种方法,你可以根据自己的需要选择最合适的方法。通过遵循这些步骤,你可以自信地处理此类响应,避免应用程序崩溃,并增强应用程序的可靠性。

常见问题解答

  1. 为什么我需要处理 204 响应?
    因为 Retrofit 默认无法处理它们,尝试从 204 响应中提取数据可能会导致应用程序崩溃。

  2. 如何使用 safeApiCall()
    将网络请求包装在 safeApiCall { ... } 块中,它将处理 204 响应并返回一个 Result 对象。

  3. 我可以使用 ResponseBody 吗?
    是的,你可以检查 ResponseBody 是否为空来确定请求是否成功。

  4. 什么时候需要创建自定义 CallAdapter
    当你需要对如何解析 204 响应进行更高级别的控制时。

  5. 我应该使用哪种方法?
    根据你的具体需求选择最合适的方法。safeApiCall() 是一个简单的选项,而自定义 CallAdapter 提供了最大的灵活性。