学海无涯

导航

浅谈 Axios 和 Fetch 的区别

1.简单区分

 

 

 

2.请求方式

axios传一个对象,里面包含请求url和请求方法,参数。 fetch传两个参数,第一个是请求url,第二个是请求的一些参数。

// axios请求:
const options = {
  url: "http://yuque.com/",
  method: "POST",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json;charset=UTF-8",
  },
  data: {
    yuque:'123'
  },
};
 
axios(options).then((response) => {
  console.log(response.status);
});
 
 
// fetch请求示例:
 
const url = "http://yuque.com/";
const options = {
  method: "POST",
  headers: {
    Accept: "application/json",
    "Content-Type": "application/json;charset=UTF-8",
  },
  body: JSON.stringify({
    yuque:'123'
  }),
};
 
fetch(url, options).then((response) => {
  console.log(response.status);
});

3.同时请求

// axios
axios.all([
    axios.get("http://yuque.com/one"),
    axios.get("http://yuque.com/two"),
  ])
  .then(
    axios.spread((obj1, obj2) => {
      ...
    })
  );

// fetch
Promise.all([
  fetch("http://yuque.com/one"),
  fetch("http://yuque.com/two"),
])
  .then(async ([res1, res2]) => {
    const a = await res1.json();
    const b = await res2.json();
  })
  .catch((error) => {
    console.log(error);
  });

4.请求的数据

在 axios 中,它是自动完成的,所以只需在请求中传递数据或从响应中获取数据。它是自动字符串化的,所以不需要其他操作。 在使用 fetch的时候,需要对响应数据使用某种方法,在发送带有请求的body时,需要对数据进行字符串化。 如下示例axios 没有额外的一行代码,在 fetch中,必须将数据转换为JSON格式。在一个较大的项目中,如果创建了大量的调用,那么可以使用 axios 来避免重复代码。
// axios
axios.get('url')
  .then((response) => console.log(response))
  .catch((error) => console.log(error))
// fetch
fetch('url')
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.log(error))

5.响应的使用

// axios
axios({
    url: 'http://yuque.com/',
    methods: 'POST',
    timeout: 4000, 
    headers: {
        Accept: "application/json",
        'Content-Type': 'application/json;charset=UTF-8',
    },
    data: {
        yuque:'123'
    }
})
.then((response) => {
    /* 处理响应 */
})
.catch((error) => console.log('请求超时'));

// fetch提供的属性AbortController
const controller = new AbortController();
const options = {
    method: 'POST',
    signal: controller.signal,
    body: JSON.stringfy({
        yuque:'123'
    }),
};
const promise = fetch('http://yuque.com/',options);
const timeout = setTimeout(() => controller.abort(),4000);
promise
.then((response) => {
    /* 处理响应*/
})
.catch((error) => console.log('请求超时'));

6.拦截的使用

// axios
axios.interceptors.request.use((config) => {
    // 在请求之前对请求参数进行处理
    return config;
});
axios.get("http://yuque.com/")
.then((response) => {
console.log(response.data);
});

// fetch
fetch = ((originalFetch) => {
  return (...arguments) => {
    const result = originalFetch.apply(this, arguments);
    return result.then(console.log("请求已发送"));
  };
})(fetch);
fetch("http:http://yuque.com/")
  .then((response) => response.json())
  .then((data) => {
    console.log(data);
  });

7.错误的处理

axios处理错误是非常容易的。如果出现像404这样的错误响应,promise就会被拒绝并返回一个错误,所以需要捕获一个错误,可以检查它是什么类型的错误。当响应良好时,接口返回了数据,但是如果请求以任何方式失败,使用axios就能够检查 .catch() 部分中的错误类型并返回正确的消息。 使用fetch,相对来说就较复杂了。每次从 fetch中得到响应时,需要检查状态是否成功,因为即使不是,也会得到响应。在 fetch的情况下,只有当请求没有完成时,promise才会被解决。
// axios
axios.get('url')
  .then((response) => console.log(response))
  .catch((error) => {
    if (error.response) {
      console.log(error.response.data)
      console.log(error.response.status)
      console.log(error.response.headers)
    } else if (error.request) {
      console.log(error.request)
    } else {
      console.log(error.message)
    }
  })
// fetch
fetch('url')
  .then((response) => {
    if (!response.ok) {
      throw Error(response.statusText);
    }
    return response.json()
  })
  .then((data) => console.log(data))
  .catch((error) => console.log(error))

总结:

通过比较可以看出,对于较大型项目有大量http请求,需要良好的错误处理或http拦截的应用,Axios是一个更好的解决方案。在小型项目的情况下,只需要少量API调用,Fetch也是一个不错的解决方案。大多数浏览器和Node.js环境都支持Axios,而现在浏览器仅支持Fetch,所以使用H5或PC的项目使用Axios相对较好,使用App内嵌H5项目,依赖App壳子中的浏览器,尽量减少Fetch的使用,以达到最好的兼容性。
 

 

  

 

posted on 2023-03-09 20:04  宁静致远.  阅读(394)  评论(0编辑  收藏  举报