Как обработать 204 ответа в Retrofit с использованием Kotlin сопрограмм? - PullRequest
3 голосов
/ 08 января 2020

Я использую Retrofit 2.7.1 с сопрограммами Kotlin.

У меня есть служба Retrofit, определенная следующим образом:

@PUT("/users/{userId}.json")
suspend fun updateUserProfile(
        @Path("userId") userId: String,
        @Query("display_name") displayName: String) : Void

Этот вызов возвращает HTTP 204 Нет содержимого ответ, который вызывает cra sh в Retrofit:

kotlin.KotlinNullPointerException: Response from com.philsoft.test.api.UserApiService.updateUserProfile was null but response body type was declared as non-null
        at retrofit2.KotlinExtensions$await$2$2.onResponse(KotlinExtensions.kt:43)
        at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:129)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:174)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

Как мне обработать 204 ответ в модификации, используя сопрограммы, без сбоев?

Ответы [ 2 ]

8 голосов
/ 08 января 2020

В соответствии с этим используйте Response<Unit> в объявлении метода дооснащения.

дооснащение не выдает содержимого

0 голосов
/ 09 апреля 2020

Вы можете использовать Response<Unit> для обработки ответа 204, используя Retrofit, но при такой обработке Retorift не будет выдавать исключение для 4xx ответов или других исключительных случаев.

Вы можете иметь дело с этим делом, как следующий код:

return try {
        val result = apiCall.invoke()
        return if (result is Response<*>) {
            if (result.code() >= 400) {
                // create an error from error body and return
            } else {
                // retur nsuccess result
            }
        } else {
            // directly return success result
        }
    } catch (t: Throwable) {
        // create an error from throwable and return it!
    }
...