fetch、ajax、axios区别

119 阅读2分钟

ajax

  •  异步js和xml
  • 底层使用XMLHttpRequest
  • 通过HTTP协议进行通信
  • 容易收到CSRF和XSS攻击

写法

$.ajax({
  type: 'POST',
  url: url,
  data: data,
  dataType: dataType,
  headers:{'Content-Type':'application/json;charset=utf8','organId':'1333333333'},  success: function() {},
  error: function() {}
});

axios

  • 从node.js创建http请求
  • 在浏览器中创建XMLHttpRequest
  • 支持Promise API
  • 提供了一些并发请求的接口
  • 支持拦截请求和响应
  • 转换请求和响应数据
  • 自动转换JSON数据
  • 客户端支持防御CSRF/XSRF

写法

axios({
    method: 'post',
    url: '/user/12345',
    data: {
        firstName: 'Fred',
        lastName: 'Flintstone'
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

  • dataType,是后台接口返回的数据格式
  1.  •”string”: 返回纯文本字符串 ,默认
  2. •”xml”: 返回 XML 文档,可用 jQuery 处理。 
  3. •”html”: 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
  4.  •”script”: 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 “cache” 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
  5.  •”json”: 返回 JSON 数据 。
  6.  •”jsonp”: JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。

  • contentType
  1. Content-Type: application/json : 请求体中的数据会以json字符串的形式发送到后端
  2. Content-Type: application/x-www-form-urlencoded:请求体中的数据会以普通表单形式(键值对)发送到后端
  3. Content-Type: multipart/form-data: 它会将请求体的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。

fetch

  • ES6新属性,基于promise

  • 原生js,没有使用XMLHttpRequest对象

  • fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理

  • fetch默认不会带cookie,需要添加配置项

  • fetch不支持abort,不支持超时控制,使用setTimeout及Promise.reject和Promise.race结合setTimeout实现的超时控制并不能阻止请求过程继续在后台执行

  • fetch没有办法原生监测请求的进度,而XHR可以

写法

try {
  let response = await fetch(url);
  let data = response.json();
  console.log(data);
} catch(e) {
  console.log("Oops, error", e);
}