我使用fetch调用Web服务,但我可以在axios的帮助下完成。所以现在我很困惑。我应该选择axios还是获取?
答案 0 :(得分:43)
Fetch和Axios在功能上非常相似,但为了更加向后兼容,Axios似乎工作得更好(例如,提取在IE 11中不起作用,请检查this post)
此外,如果您使用JSON请求,以下是我偶然发现的一些差异。
获取JSON帖子请求
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发布请求
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
}
所以:
希望这有帮助。
答案 1 :(得分:25)
它们是HTTP请求库......
我最终遇到了同样的疑问,但此post中的表格让我选择isomorphic-fetch
。哪个是fetch
,但适用于NodeJS。
答案 2 :(得分:12)
根据 mzabriskie on GitHub:
总的来说,它们非常相似。 axios的一些好处:
变形金刚:允许在发出请求之前或收到回复后对数据进行变换
拦截器:允许您完全更改请求或响应(标题也是如此)。另外,请求之前执行异步操作 在Promise定居之前或之前
内置XSRF保护
我认为你应该使用axios。
答案 3 :(得分:6)
对此也很好奇,在这里找到了你的问题,然后找到了这个可能有用的中篇文章。 Fetch看起来有点冗长和无情:https://medium.com/@shahata/why-i-wont-be-using-fetch-api-in-my-apps-6900e6c6fe78#.wxtu3qnte
答案 4 :(得分:2)
Axios是一个独立的第三方软件包,可以使用NPM轻松安装到React项目中。
您提到的另一个选项是获取功能。与Axios不同,fetch()
内置于大多数现代浏览器中。借助fetch,您无需安装第三方软件包。
由您自己决定,如果您不知道自己在做什么,则可以选择fetch()
并可能搞砸,或者只是使用Axios,我认为这更简单。
答案 5 :(得分:2)
获取API,需要处理两个Promise才能在JSON Object属性中获取响应数据。而axios结果变成JSON对象。
错误处理在fetch中也有所不同,因为它不处理catch块中的服务器端错误,即使响应是HTTP 404,从fetch()返回的Promise也不会拒绝HTTP错误状态或500。相反,它将正常解析(ok状态设置为false),并且仅在网络故障或有任何阻止请求完成的情况下拒绝。在axios中,您可以在catch块中捕获所有错误。
我会说最好使用axios,它易于处理拦截器,标头配置,设置cookie和错误处理。
答案 6 :(得分:1)
另外......我在测试中使用各种库,并注意到他们对4xx请求的不同处理。在这种情况下,我的测试返回一个带有400响应的json对象。这是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响应而node-fetch
则不会。此外,fetch
使用json解析的承诺。
答案 7 :(得分:1)
获取API和axios API之间的另一个主要区别
答案 8 :(得分:0)
获取时,我们需要处理两个承诺。借助axios,我们可以直接在响应对象数据属性内访问JSON结果。
答案 9 :(得分:0)
我似乎做了很多工作,它是通过ajax发送表单,通常包括一个附件和几个输入字段。在更经典的工作流程 (HTML/PHP/JQuery) 中,我在客户端使用 $.ajax()
,在服务器使用 PHP 并取得了完全成功。
我已经将 axios 用于 dart/flutter,但现在我正在学习 React 来构建我的网站,而 JQuery 没有意义。
问题是 axios 在另一方面让我对 PHP 感到头疼,当发布两个正常的输入字段并以相同的形式上传文件时。我在 PHP 中尝试了 $_POST
和 file_get_contents("php://input")
,从带有 FormData 的 axios 发送或使用 json 构造,但我永远无法同时获取文件上传和输入字段。
另一方面,使用 Fetch 我已经成功使用此代码:
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);
}
答案 10 :(得分:-1)
axios的好处: