当前位置: 首页 > 知识库问答 >
问题:

如何使用Kotlin协同程序处理改造中的204响应?

拓拔德馨
2023-03-14

我使用改造2.7.1与静态编程语言协程。

我的改装服务定义如下:

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

此调用返回HTTP 204无内容响应,这会导致改装时崩溃:

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响应而不崩溃?

共有3个答案

阙新觉
2023-03-14

用示例代码解释@Dmitri的答案:

>

  • 在你的APIInterface中,这样调用你的API,

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

    其中,响应为2。响应

    在调用API的地方,检查函数的状态代码,如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))
     }
    

  • 公西承
    2023-03-14

    您可以使用Response

    您可以使用以下代码处理这些情况:

    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!
        }
    

    闾丘山
    2023-03-14

    根据这一点,使用Response

    改装无内容问题

     类似资料:
    • 我使用Refught2调用kotlin协同程序的API,但API的状态代码为200、400和700。当请求API和响应状态代码为400或700时,“withTimeout”协同程序可能会异常崩溃。我想处理带有“withTimeout”协同程序的状态代码400和700响应消息,或者如何自定义“协同程序”谢谢。 这是我的密码 错误消息

    • 最近,我通过学习CodeLabs教程学习了kotlin coroutine。经过一些实践,我想知道我是否可以用java编写相同的代码。首先,我在MyKotlinFragment中编写了一个简单的kotlin代码。kt文件如下: 在我的片段中调用了;它起作用了。 接下来,我打开了一个名为MyRoutineFragment的java文件。java在同一个项目中,但我无法让它工作。 我无法将第一个文件转

    • 我正在尝试使用SimpleXML将改装xml响应序列化到一个对象中。 但是出现以下例外情况: org.simpleframework.xml.core.值必需异常:无法满足@org.simpleframework.xml.ElementList(data=false,空=true,入口=,内联=true,名称=ALLFile,必需=true,类型=无效)字段'file" 响应示例: 对象: 我收到

    • 当没有数据avilable时,它返回以下JSON: http://www.omdbapi.com/?t=asdasdas

    • 我使用的是最新版本的改造,改造2,v2.0.0-beta3。API响应是User对象或空响应(空值)。如果我发送正确的用户名/密码,那么句柄将进入带有成功用户对象的响应方法。但是如果发送错误的密码,那么API将不返回任何内容,响应头中的值很少。但是我在onFailure(可抛出)中得到了MalformedJsonExc0019。 “com.google.gson.stream.MalformedJ

    • 我看到的主题,如如何下载文件在Android使用改造库?,他们使用和RxJava/回调。 我有Kotlin、协同程序、改装2.6.0和类似于中的查询https://stackoverflow.com/a/56473934/2914140: 我有一个改装客户: 如果令牌参数正确,查询将返回PDF文件: 如果是错误的,它将返回带有错误描述的JSON: 因此,ExportResponse是一个包含JSO