我使用的是带有Kotlin协同程序的Retrofit 2.7.1。
我的改装服务定义如下:
@PUT("/users/{userId}.json")
suspend fun updateUserProfile(
@Path("userId") userId: String,
@Query("display_name") displayName: String) : Void
此调用返回HTTP 204 No Content响应,这会导致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响应而不崩溃?
5条答案
按热度按时间axr492tv1#
据此,在改型方法声明中使用
Response<Unit>
。retrofit no content issue
w7t8yxp52#
您可以使用
Response<Unit>
来处理204个响应,但是当您像这样处理时,Retrofit
不会为4xx
响应或其他异常情况抛出异常。您可以使用以下代码处理这些情况:
mzmfm0qo3#
使用示例代码解释@Dmitri的答案:
1.在APIInterface中,像这样调用API,
其中,响应为
retrofit2.Response
1.从调用API的位置,检查
apiResponse.code()
等函数的状态代码。olqngx594#
使用自定义拦截器将
204
的更改为200
的对我很有效um6iljoc5#
这可能会帮助某人在okhttp客户端构建器(示例化改型示例)中,我们添加了标头。我添加了错误的标头,导致HTTP 400 Bad request错误,删除以下内容对我有效。