当前位置: 首页 > 知识库问答 >
问题:

如何获取HTTP状态代码(400, 200...)在观察者

朱和惬
2023-03-14

有没有办法获取HTTP状态码(比如200400…)在观察实时数据之前?

这是我的实现:

后果

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>()
}

基本存储库

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 {

})

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

共有1个答案

颜畅
2023-03-14

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

为了实现这一点,您需要在存储库或视图模型中检查它。

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

差不多

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) {

    }
}

您可以从链接中看到其他解决方案(包括此解决方案)

编辑

我认为您可以从safeapireult函数中的响应对象访问代码。只需尝试响应即可。代码

 类似资料:
  • 问题内容: 调用JAX-WS端点时,如何获取HTTP响应代码? 在下面的示例代码中,在调用Web服务时可能会引发Exception,例如或。 在这种情况下,如何从HTTP响应中获取HTTP状态代码? 问题答案: 完成@Praveen答案后,您必须将变成原始值,然后从上下文中获取值。 如果您在托管的Web服务客户端中发生异常,请不要忘记将事务标记为回滚。

  • 我希望检索HTTP响应状态代码(例如,400、401、403、503等),以防请求失败(理想情况下也是成功)。在这段代码中,我使用HTTP Basic执行用户身份验证,并希望能够在用户错误键入密码时向用户发送身份验证失败的消息。 不幸的是,产生的错误似乎并不表示实际收到了HTTP状态代码409: 此外,在发生错误时检索HTTP正文会很好,因为我的服务器端将在那里放置错误的文本描述。 问题 是否可以

  • 问题内容: 我想记录301s和302s,但是找不到在Client.Do,Get,doFollowingRedirects,CheckRedirect中读取响应状态代码的方法。我是否必须自己实施重定向才能实现这一目标? 问题答案: 该类型允许您指定自定义传输方式,这应允许您执行后续操作。应该执行以下操作: (如果仅支持链接到默认传输,则可以稍微简化一下)。 然后,您可以使用此传输方式创建客户端,并记

  • 在Axios文档中: 我们知道我们可以在

  • 这可能看起来很愚蠢,但是我试图在Axios中请求失败时获取错误数据。 是否可以获取一个可能包含状态代码和内容的对象,而不是字符串?例如:

  • 如何从的结果中获取HTTP状态?