Wie wird die 204-Antwort in Retrofit mit Kotlin-Coroutinen behandelt?

Lesezeit: 2 Minuten

Benutzeravatar von PhillyTheThrilly
PhillyTheThrilly

Ich verwende Retrofit 2.7.1 mit Kotlin-Coroutinen.

Ich habe einen Retrofit-Service wie folgt definiert:

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

Dieser Aufruf gibt eine zurück HTTP 204 Kein Inhalt Antwort, die einen Absturz in Retrofit verursacht:

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)

Wie gehe ich mit einer 204-Antwort in der Nachrüstung mit Coroutinen um, ohne abzustürzen?

  • Möglicherweise hier beantwortet: stackoverflow.com/questions/37116364/…

    – CoryRoy

    7. Januar 2020 um 21:33 Uhr

Benutzeravatar von Dmitri
Dimitri

Verwenden Sie dementsprechend Response<Unit> in der Deklaration der Retrofit-Methode.

nachrüsten kein Inhaltsproblem

  • Ich habe fast 2 Tage mit diesem Problem verbracht, endlich funktioniert es gut mit Ihrer Lösung. Danke.

    – CKT

    4. August 2020 um 8:27 Uhr

  • Dies ist eine hilfreiche Antwort!

    – Yoonhok

    10. März 2022 um 8:05 Uhr

  • Wenn die API sowohl Null- als auch Nicht-Null-Werte zurückgeben kann, funktioniert diese Lösung nicht.

    – Johannes

    31. März 2022 um 12:32 Uhr

Benutzeravatar von savepopulation
Bevölkerung retten

Sie können verwenden Response<Unit> um 204 Antworten zu verarbeiten Retrofit aber wenn du so handelst Retrofit löst keine Ausnahme für aus 4xx Antworten oder andere Ausnahmefälle.

Sie können diese Fälle mit dem folgenden Code behandeln:

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

  • Wie bekomme ich Nachrichtendaten von 205?

    – Ralph Gabb

    19. Mai 2020 um 13:37 Uhr

Benutzeravatar von Kishan Solanki
Kischan Solanki

Erklärende Antwort von @Dmitri mit dem Beispielcode:

  1. Rufen Sie in Ihrem APIInterface Ihre API so auf,

     @GET(AppConstants.APIEndPoints.GET_NEWS)
     suspend fun getNews(
         @Query("limit") limit: String,
     ): Response<NewsListResponseModel>
    

wo, Antwort ist retrofit2.Response

  1. Suchen Sie von dort aus, wo Sie die API aufrufen, nach dem Statuscode der Funktion like apiResponse.code().

    val apiResponse = apiEndPointsInterface.getNews(limit)
    if (apiResponse.code() == HttpURLConnection.HTTP_OK) {
         //response success
         ResultOf.Success(apiResponse.body()!!))
     } else {
         //handle your other response codes here
         ResultOf.Failure("No Data Found.", null))
     }
    

  • Endlich funktioniert es mit deiner Lösung. Danke.

    – khaleel_jageer

    16. Januar 2021 um 7:02 Uhr

Benutzeravatar von GiridharaSPK
GiridharaSPK

dies könnte jemandem helfen Im okhttp-Client-Builder (um die Retrofit-Instanz zu instanziieren) fügen wir Header hinzu. Ich habe falsche Header hinzugefügt, die bei mir den Fehler „HTTP 400 Bad Request“ verursacht haben. Das Entfernen des Folgenden hat bei mir funktioniert. Überprüfen Sie also bitte Ihre und gehen Sie entsprechend vor.

      .addHeader("Content-Encoding", "UTF-8")
      .header("Accept-Encoding", "identity")     

1443030cookie-checkWie wird die 204-Antwort in Retrofit mit Kotlin-Coroutinen behandelt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy