У меня есть простая задача, используемая для вызова API Rest с помощью дооснащения для входа в систему. Работает хорошо:
class SignInTask constructor(
private val apiService: ApiService,
private val signIn: SignIn,
private val db: Db
) : Runnable {
private val _liveData = MutableLiveData<Resource<SignResponse>>()
val liveData: LiveData<Resource<SignResponse>> = _liveData
override fun run() {
val newValue = try {
val response = apiService.signIn(signIn).execute()
val apiResponse = ApiResponse.create(response)
when (apiResponse) {
is ApiSuccessResponse -> {
_liveData.postValue(Resource.success(apiResponse.body))
}
is ApiEmptyResponse -> {
Resource.success(false)
}
is ApiErrorResponse -> {
Resource.error(apiResponse.errorMessage, true)
}
}
} catch (e: IOException) {
Resource.error(e.message!!, true)
}
_liveData.postValue(newValue as Resource<SignResponse>?)
}
}
соответствующая услуга переоборудования API:
@POST("/v1/signin/")
fun signIn(@Body signIn: SignIn): Call<SignResponse>
Мне нужноизмените это на form-data, так как бэкэнд был изменен и запрашивает его.Поэтому я добавил requestBody
class SignInTask constructor(
private val apiService: ApiService,
private val signIn: SignIn,
private val db: FastcountDb
) : Runnable {
private val _liveData = MutableLiveData<Resource<SignResponse>>()
val liveData: LiveData<Resource<SignResponse>> = _liveData
override fun run() {
val requestBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("email", signIn.email)
.addFormDataPart("password", signIn.password)
.addFormDataPart("tenant", signIn.tenant.toString())
.build()
val newValue = try {
val response = apiService.signIn(requestBody).execute()
val apiResponse = ApiResponse.create(response)
when (apiResponse) {
is ApiSuccessResponse -> {
_liveData.postValue(Resource.success(apiResponse.body))
}
is ApiEmptyResponse -> {
Resource.success(false)
}
is ApiErrorResponse -> {
Resource.error(apiResponse.errorMessage, true)
}
}
} catch (e: IOException) {
Resource.error(e.message!!, true)
}
_liveData.postValue(newValue as Resource<SignResponse>?)
}
}
Служба модификации API:
@POST("/v1/signin/")
fun signIn(@Body body: RequestBody): Call<SignResponse>
Единственное изменение создано и добавлен requestBody.Проблема в том, что теперь приложение падает на линии
_liveData.postValue(newValue as Resource<SignResponse>?)
с
java.lang.ClassCastException: kotlin.Unit cannot be cast to at.ivii.fastcount.vo.Resource
at at.ivii.fastcount.repository.task.SignInTask.run(SignInTask.kt:52)
Во время отладки я вижу, что вызов API успешно завершен с 200 и правильным ответом, но это просто сбой.