将改造错误转化为成功

时间:2018-04-04 16:28:04

标签: android retrofit

我连接的API可以返回几种类型的响应(解释出现了什么问题)以及500错误,我想在代码中处理这些响应以及正常的200响应,而没有Retrofit抛出异常这种情况。这种方式更容易,更不用说 - 在500的情况下,Rertofit抛出的错误不包括JSON格式的有趣响应澄清。

我能够找到有关Interceptor的信息,但这并没有让我走得太远,500仍然会抛出异常:

    OkHttpClient.Builder()
            .addInterceptor {
                val response = it.proceed(it.request())

                if(response.code()==500) {
                    println("Here!")
                }

                response
            }
            .cookieJar(instance())
            .build()

我需要的是使Retrofit反序列化500返回的JSON,因为它是常规响应,并将其放在我的常规响应类的error字段中。可能吗?注意:所有错误都作为响应主体内的JSON对象返回。

1 个答案:

答案 0 :(得分:0)

由于API格式会影响整个应用程序的错误处理行为,您可以做的是更改拦截器以重写响应并将状态代码修改为200以避免500响应代码抛出的异常。

但是, 非常谨慎 ,因为这会完全改变处理特定HTTP状态代码的方式,因此非常不鼓励这样做。此外,以下代码段中没有错误处理。

OkHttpClient.Builder().addInterceptor {
val response = it.proceed(it.request())

if (response.code() == 500) {
    val mediaType = response.body()!!.contentType()
    val yourResponseObject = response.body()!!.string() // de-serialize response.body() to your response class and change fields as necessary
    val newResponse = response.newBuilder()
            .body(ResponseBody.create(mediaType, yourResponseObject)) //Create and set the response body
            .code(200)  //change the response code to a Success PROCEED WITH CAUTION!
            .build()
    return newResponse
}
return response
}
.cookieJar(instance())
.build()

这将重写您对响应类的响应,因为您可以访问ResponseBody,然后将状态代码更改为200 Success以避免错误/异常块结束

更多信息:OkHttp Github wiki: Interceptors - Rewriting Responses