我正在使用Fetch调用Web服务,但是我也可以使用Axios来做同样的事情。所以现在我感到困惑。我应该选择Axios还是Fetch?
我正在使用Fetch调用Web服务,但是我也可以使用Axios来做同样的事情。所以现在我感到困惑。我应该选择Axios还是Fetch?
let url = 'https://someurl.com';
let options = {
method: 'POST',
mode: 'cors',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
body: JSON.stringify({
property_one: value_one,
property_two: value_two
})
};
let response = await fetch(url, options);
let responseOK = response && response.ok;
if (responseOK) {
let data = await response.json();
// do something with data
}
Axios JSON post请求
let url = 'https://someurl.com';
let options = {
method: 'POST',
url: url,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json;charset=UTF-8'
},
data: {
property_one: value_one,
property_two: value_two
}
};
let response = await axios(options);
let responseOK = response && response.status === 200 && response.statusText === 'OK';
if (responseOK) {
let data = await response.data;
// do something with data
}
response.ok
是一个布尔值,而 true
或 false
的值表示响应是否正常。用户离线由 fetch()
拒绝处理,但其他类型的服务器错误由 response.ok
处理。 - nonopolarity它们是HTTP请求库...
我最终也有同样的疑问,但在这个帖子中的表格让我选择isomorphic-fetch
。它是fetch
但适用于NodeJS。
http://andrewhfarmer.com/ajax-libraries/
上面的链接已经失效。 相同的表格在这里:https://www.javascriptstuff.com/ajax-libraries/
fetch
定义为"原生"(意味着您可以直接使用它 - 无需包含任何库),但实际上在某些平台上并没有实现fetch
(尤其是在所有版本的IE中),因此您仍需要提供外部polyfill。请参考此处链接以了解详情。 - Luca Fagiolifetch API和axios API之间还有一个重要的区别
Fetch API需要处理两个Promise才能获取JSON对象属性中的响应数据,而axios直接返回JSON对象。
在错误处理方面,fetch与axios不同,它在catch块中不能处理服务器端错误,即使响应是HTTP 404或500,从fetch()返回的Promise也不会拒绝HTTP错误状态。相反,它将正常解析(设置为假的ok状态),只有在网络故障或任何阻止请求完成时才会拒绝。而使用axios则可以在catch块中捕获所有错误。
我建议使用axios,直接处理拦截器、头部配置、设置cookie和错误处理。
Axios是一个独立的第三方包,可以通过NPM轻松安装到React项目中。
你提到的另一种选择是fetch函数。与Axios不同,fetch()
已内置在大多数现代浏览器中。使用fetch时,您无需安装第三方包。
所以,由你决定,你可以使用fetch()
,但如果你不知道自己在做什么,可能会出错,或者使用我认为更加简单的Axios。
axios的优点:
此外...我在测试中尝试使用不同的库,并注意到它们对于4xx请求的处理方式不同。在这种情况下,我的测试返回一个带有400响应的JSON对象。以下是3个流行库处理此响应的方式:
// request-promise-native
const body = request({ url: url, json: true })
const res = await t.throws(body);
console.log(res.error)
// node-fetch
const body = await fetch(url)
console.log(await body.json())
// Axios
const body = axios.get(url)
const res = await t.throws(body);
console.log(res.response.data)
值得注意的是,request-promise-native
和 axios
在收到 4xx 响应时会抛出异常,而 node-fetch
则不会。此外,fetch
使用一个 promise 来解析 JSON。
.throws
方法来测试错误抛出。在这种情况下,我正在测试从所有3个库中拒绝的情况,并注意到返回的数据差异。 - cyberwombat使用fetch时,需要处理两个Promise对象。使用axios时,可以直接访问响应对象data属性中的JSON结果。