我使用Fetch调用web服务,但我可以在Axios的帮助下做同样的事情。现在我很困惑。我应该选择Axios还是Fetch?
当前回答
除了……我在测试中使用了各种lib,并注意到它们对4xx请求的不同处理。在这种情况下,我的测试返回一个json对象,响应为400。这是3个流行的libs处理响应的方式:
// 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响应上抛出,而节点获取则不会抛出。fetch还使用了json解析的promise。
其他回答
axios的好处:
变形:允许在发出请求之前或在收到响应之后对数据进行转换 拦截器:允许您完全更改请求或响应(包括头)。也执行异步操作之前提出请求或承诺解决之前 内置XSRF保护
axios相对于fetch的优点
根据mzabriskie在GitHub上的说法:
总的来说,它们非常相似。axios的一些好处: 变形:允许在发出请求之前或在接收到响应之后对数据进行转换 拦截器:允许您完全更改请求或响应(包括头)。另外,在请求被发送之前执行异步操作 在承诺解决之前 内置XSRF保护
请检查浏览器支持Axios
我认为您应该使用axios。
一份工作,我做了很多似乎,这是通过ajax发送表单,通常包括一个附件和几个输入字段。在更经典的工作流程(HTML/PHP/JQuery)中,我在客户端和服务器端使用了$.ajax(),并获得了完全的成功。
我已经使用axios dart/flutter,但现在我正在学习react来构建我的网站,JQuery没有意义。
问题是axios在另一方面给了我一些头疼的PHP,当张贴正常的输入字段和上传文件在同一形式。我尝试了$_POST和file_get_contents(“php://input”)在php中,从axios与FormData或使用json构造发送,但我永远无法同时获得文件上传和输入字段。
另一方面,我成功地使用了下面的代码:
var formid = e.target.id;
// populate FormData
var fd = buildFormData(formid);
// post to remote
fetch('apiurl.php', {
method: 'POST',
body: fd,
headers:
{
'Authorization' : 'auth',
"X-Requested-With" : "XMLHttpRequest"
}
})
在PHP方面,我能够通过$_FILES检索上传,并通过$_POST处理其他字段数据:
$posts = [];
foreach ($_POST as $post) {
$posts[] = json_decode($post);
}
Axios是一个基于承诺的HTTP客户端库,而Fetch是一个用于发出API请求的javascript API。
主要区别是浏览器支持:Axios支持包括IE在内的所有浏览器,而Fetch只支持最新的浏览器,IE不支持。
参考链接:https://github.com/axios/axios浏览器支持
https://caniuse.com/fetch
与获取API相比,Axios具有更好的错误处理。Axios可以抛出400到500个范围的状态代码错误,而在fetch API中,您需要手动处理这些错误。 更多信息请访问:https://bariablogger.in/f/axios-vs-fetch-react
除了……我在测试中使用了各种lib,并注意到它们对4xx请求的不同处理。在这种情况下,我的测试返回一个json对象,响应为400。这是3个流行的libs处理响应的方式:
// 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响应上抛出,而节点获取则不会抛出。fetch还使用了json解析的promise。