【问题标题】:How to get HTTP status code (400, 200...) on Observer如何在 Observer 上获取 HTTP 状态码(400、200...)
【发布时间】:2020-02-24 15:41:53
【问题描述】:

有没有办法在观察实时数据之前获取 HTTP 状态代码(如 200、400...)?

这是我的实现:

结果

sealed class Result<out T: Any> {

    data class Success<out T : Any>(val data: T?): Result<T>()
    data class Error(val exception: Exception): Result<Nothing>()
}

BaseRepository

open class BaseRepository {

    suspend fun <T: Any> safeApiCall(call: suspend () -> Response<T>, errorMessage: String): T? {
        val result: Result<T> = safeApiResult(call, errorMessage)
        var data: T? = null

        when(result) {
            is Result.Success ->
                data = result.data
            is Result.Error -> {
                Logger.getLogger("1.DataRepository").log(Level.INFO, "$errorMessage & Exception - ${result.exception}")
            }
        }

        return data
    }

    private suspend fun <T: Any> safeApiResult(call: suspend ()-> Response<T>, errorMessage: String): Result<T> {
        val response = call.invoke()

        if (response.isSuccessful) return Result.Success(response.body())

        return Result.Error(IOException("Error Occurred during getting safe Api result, Custom ERROR - $errorMessage"))
    }
}

我的存储库

class UserRepository (private val api : UserService) : BaseRepository() {

    suspend fun getFavorites() : MutableList<Favorite>? {
        return safeApiCall(
            call = {api.getFavorites().await()},
            errorMessage = "Error Fetching Favorites"
        )?.toMutableList()
    }
}

视图模型

class UserViewModel : ViewModel() {

    private val parentJob = Job()

    private val coroutineContext: CoroutineContext
        get() = parentJob + Dispatchers.Default

    private val scope = CoroutineScope(coroutineContext)

    private val repository: UserRepository = UserRepository(ApiFactory.Apifactory.userService)

    val favoritesLiveData = MutableLiveData<MutableList<Favorite>>()

    fun fetchFavorites() {
        scope.launch {
            val favorites = repository.getFavorites()
            favoritesLiveData.postValue(favorites)
        }
    }
}

在我的代码中,我做了这样的事情:

userViewModel.fetchFavorites()

userViewModel.favoritesLiveData.observe(this, Observer {

})

在哪里可以查看状态码?我不知道在哪里实现状态码返回。

【问题讨论】:

    标签: android kotlin android-livedata


    【解决方案1】:

    您不是从实时数据中执行此操作,因为它是通过填充活动/片段等中的视图将数据呈现给用户的最后一步(或者确切地说是在最后一步之前)...

    为了做到这一点,您需要在您的存储库或您的 viewModel 中检查它。

    在将结果解析为模型之前,您可以检查响应的代码

    有点像

    public abstract class SuccessCallback<T> extends BaseCallBack<T> implements Callback<T>{
    
    
        @Override
        public void onResponse(Call<T> call, Response<T> response) {
    
            if(response.code()>= 400 && response.code() < 599){
                 onFailure(response);
            }
            else {
                onSuccess(response);
            }
    
        }
    
        @Override
        public void onFailure(Call<T> call, Throwable t){
    
        }
    
        @Override
        public void onSuccess(Response<T> response) {
    
        }
    
        @Override
        public void onFailure(Response<T> response) {
    
        }
    }
    

    您可以从link看到其他解决方案(包括这个)

    编辑

    我认为您可以从safeApiResult 函数中的响应对象访问代码。试试response.code

    【讨论】:

    • 感谢您的帮助,但我没有使用与您相同的实现,它与我的相同方式是什么? (我编辑了问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2010-11-22
    • 2018-05-01
    相关资源
    最近更新 更多