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
Dimitri
Verwenden Sie dementsprechend Response<Unit> in der Deklaration der Retrofit-Methode.
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
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
Kischan Solanki
Erklärende Antwort von @Dmitri mit dem Beispielcode:
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
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
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.
Möglicherweise hier beantwortet: stackoverflow.com/questions/37116364/…
– CoryRoy
7. Januar 2020 um 21:33 Uhr