有没有办法获取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 {
})
在哪里可以查看状态代码?我不知道在哪里实现状态码返回。
您不是从实时数据执行此操作,因为这是最后一步(确切地说是最后一步之前的一步),您的数据通过填充活动/片段等中的视图呈现给用户。。。
为了实现这一点,您需要在存储库或视图模型中检查它。
在将结果解析到模型之前,可以检查响应的代码
差不多
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状态?