我连接的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对象返回。
答案 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以避免错误/异常块结束