У меня есть следующий класс:
interface API
{
@GET("/data.json")
suspend fun fetchData() : MyResponse
companion object
{
private val BASE_URL = "http://10.0.2.2:8080/"
fun create(): MyAPI
{
val gson = GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create()
val retrofit = Retrofit.Builder()
.addConverterFactory( GsonConverterFactory.create( gson ) )
.baseUrl( BASE_URL )
.build()
return retrofit.create( MyAPI::class.java )
}
}
}
Я называю это следующим образом:
val data = StadiumAPI.create().fetchData()
Log.d( "gotdata", data.toString() )
Все отлично работает, но теперь я хочу обрабатывать ошибки, я 'Я пытаюсь сделать что-то вроде этого:
Var response = StadiumAPI.create().fetchData()
when( response.state )
{
Success -> doSomethingWithTheData( response.data )
Error -> showError( response.error )
Processing -> showSpinner()
}
Основная проблема заключается в том, что не только мне нужно обрабатывать успех / ошибку (на основе кода состояния HTTP и если преобразование GSON прошло успешно), но и обрабатывать исключения(например, проблемы с сетью) и передайте их как Error в состояние ответа, а также сохраните автоматическое преобразование с GSON, не обрабатывая его вручную.
Я совершенно заблудился, куда идти отсюда. Насколько я понял, мне нужно создать пользовательский тип данных в API ответа модифицированной системы, который будет «принимать» ответ, а затем я мог бы манипулировать его свойствами для создания структуры кода выше. Не могли бы вы указать мне правильное направление, куда я должен идти отсюда? Спасибо!
----------- РЕДАКТИРОВАТЬ -------------------------------------------
Я узнал, что могу делать то, что пытаюсь, следующим образом:
interface API
{
@GET("/data.json")
suspend fun fetchData() : ApiResponse<MyResponse>
....
}
А вот ApiResponse :
sealed class ApiResponse<T> {
companion object {
fun <T> create(response: Response<T>): ApiResponse<T> {
Log.d( "networkdebug", "success: " + response.body().toString() )
return if(response.isSuccessful) {
Log.d( "networkdebug", "success: " + response.body().toString() )
val body = response.body()
// Empty body
if (body == null || response.code() == 204) {
ApiSuccessEmptyResponse()
} else {
ApiSuccessResponse(body)
}
} else {
val msg = response.errorBody()?.string()
Log.d( "networkdebug", "error: " + msg.toString() )
val errorMessage = if(msg.isNullOrEmpty()) {
response.message()
} else {
msg
}
ApiErrorResponse(errorMessage ?: "Unknown error")
}
}
}
}
class ApiSuccessResponse<T>(val data: T): ApiResponse<T>()
class ApiSuccessEmptyResponse<T>: ApiResponse<T>()
class ApiErrorResponse<T>(val errorMessage: String): ApiResponse<T>()
Но по какой-то причине CompanionObject в ApiResponse вообще не срабатывает, есть какие-либо намеки на то, что я могу делать неправильно? Спасибо!