Axios和Fetch有什么区别?

时间:2016-11-28 12:24:56

标签: ajax reactjs xmlhttprequest es6-promise es6-modules

我使用fetch调用Web服务,但我可以在axios的帮助下完成。所以现在我很困惑。我应该选择axios还是获取?

11 个答案:

答案 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
}

所以:

  • 抓取正文 = Axios'数据
  • Fetch的正文必须字符串化,Axios的数据包含对象
  • 请求对象中的没有网址,请求对象中的
  • 获取请求函数包含 url as parameters ,Axios请求函数不包含url as parameter
  • 获取请求确定当响应对象包含 ok属性时,当状态为200 确定 >和 statusText为'确定'
  • 要获取json对象响应:在fetch中调用响应对象上的 json()函数,在Axios中获取响应对象的数据属性

希望这有帮助。

答案 1 :(得分:25)

它们是HTTP请求库......

我最终遇到了同样的疑问,但此post中的表格让我选择isomorphic-fetch。哪个是fetch,但适用于NodeJS。

http://andrewhfarmer.com/ajax-libraries/

答案 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)

  1. 获取API,需要处理两个Promise才能在JSON Object属性中获取响应数据。而axios结果变成JSON对象。

  2. 错误处理在fetch中也有所不同,因为它不处理catch块中的服务器端错误,即使响应是HTTP 404,从fetch()返回的Promise也不会拒绝HTTP错误状态或500。相反,它将正常解析(ok状态设置为false),并且仅在网络故障或有任何阻止请求完成的情况下拒绝。在axios中,您可以在catch块中捕获所有错误。

我会说最好使用axios,它易于处理拦截器,标头配置,设置cookie和错误处理。

Refer this

答案 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-nativeaxios会引发4xx响应而node-fetch则不会。此外,fetch使用json解析的承诺。

答案 7 :(得分:1)

获取API和axios API之间的另一个主要区别

  • 使用服务工作者时,如果要拦截HTTP请求,则必须仅使用获取API
  • 例如使用Service Worker在PWA中执行缓存时,如果您使用的是axios API,则将无法进行缓存(仅适用于访存API)

答案 8 :(得分:0)

获取时,我们需要处理两个承诺。借助axios,我们可以直接在响应对象数据属性内访问JSON结果。

答案 9 :(得分:0)

我似乎做了很多工作,它是通过ajax发送表单,通常包括一个附件和几个输入字段。在更经典的工作流程 (HTML/PHP/JQuery) 中,我在客户端使用 $.ajax(),在服务器使用 PHP 并取得了完全成功。

我已经将 axios 用于 dart/flutter,但现在我正在学习 React 来构建我的网站,而 JQuery 没有意义。

问题是 axios 在另一方面让我对 PHP 感到头疼,当发布两个正常的输入字段并以相同的形式上传文件时。我在 PHP 中尝试了 $_POSTfile_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的好处:

  • 变形金刚:允许在提出请求之前或收到回复后对数据进行变换
  • 拦截器:允许您完全更改请求或响应(标头也是如此)。在提出请求之前或在Promise结算之前执行异步操作
  • 内置XSRF保护

Advantages of axios over fetch