[英]react native fetch api check http status before converting to json
下面的代碼正在發出ajax請求並獲取數據。 如您所見, then((response) => response.json())
將響應轉換為json。 但是,如果http狀態未經授權或其他原因(400、401等)並且未返回json數據,該怎么辦。 在將響應轉換為json之前,還有什么更好的方法來檢查狀態代碼嗎?
我想catch是我可以執行此操作的地方,但是,我想保留未處理異常的catch。 基於狀態代碼,我想顯示用戶收到的確切錯誤(出於安全原因,當然不用於登錄組件)。 例如,無效的授權,無效的令牌。
我的提取代碼如下所示:
onLoginPressed() {
fetch('http://localhost:8080/api/user/login', {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
username: this.state.username,
password: this.state.password
})
}).then((response) => response.json())
.then((responseJson) => {
if (responseJson.status === 500) {
Alert.alert(responseJson.message);
} else if(responseJson.profileCompleted == false){
this.props.navigation.navigate('SetupOne');
} else {
this.props.navigation.navigate('Home');
}
}).catch((error) => {
console.error(error);
});
}
如果您查看fetch的文檔,則會看到以下內容:
即使響應是HTTP 404或500,從fetch()返回的Promise也不會拒絕HTTP錯誤狀態。相反,它將正常解析(ok狀態設置為false),並且僅在網絡故障或失敗時拒絕。如果有任何事情阻止了請求的完成。
再往下走:
准確檢查成功的fetch()包括檢查已解決的諾言,然后檢查
Response.ok
屬性的值為true。
因此,換句話說,如果這與您有關,則可能需要先進行狀態檢查,然后再進行json主體轉換。 類似於以下內容:
const handleResponse = res => {
if(res.ok) {
return res.json()
}
throw new Error('Network response was not ok.')
}
fetch(someUrl, details)
.then(handleResponse)
.then(doYourWorkWithJSON)
.catch(err => console.error(err))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.