axios请求方法的别名,拦截器以及文件上传

375 阅读4分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

Ajax 提交表单数据

form表单

表单的作用就是收集数据,表单默认提交是submit,当我们提交表单会跳转和刷新页面,所以我们使用表单收集数据时需要阻止表单的默认行为

第一种方法

表单注册submit事件,阻止默认行为

document.querySelector('form').addEventListener('submit',function(e){
    e.preventDefault();
})

第二种方法

给按钮(表单中按钮默认是submit类型)注册点击事件,阻止默认行为

document.querySelector('input[type=submit]').addEventListener('click',function(e){
    e.preventDefault();
})

使用jQuery中的serialize()快速收集表单数据

jqery简单了解

jqery是上个时代特别好用的一个第三方库,但是现在逐渐被淘汰了,它最出色的就是链式编程,非常简单方便,用了让人乐不思蜀,魂牵梦萦...(但是已经被淘汰了,主要学习用serialize()快速收集表单数据)

如果不使用serialize()的话,我们需要依次用dom获取各个表单的值,表单数据少了还好说,但多了就会特别繁琐,而serialize()可以帮我们快速收集表单的数据

注意:使用serialize()时,input必须加name

   const form = document.querySelector('#addForm');
      form.addEventListener('submit', function (e) {
        e.preventDefault();
        const data = $(this).serialize();   //其中$(this)相当于传入了form表单对象,然后调用serialize();
        axios.post('/api/addbook', data).then(({ data: res }) => {
          if (res.code != 201) return alert(res.msg);
        });
   } )

serialize()获取的值相当于格式是 'a=1&b=2' 这种类型的数据

axios请求别名(简单类型的axios请求)

在实际开发中,常用的 5 种请求方式分别是:

GET、POST、PUT、PATCH、DELETE

为了简化开发者的使用过程,axios 为所有支持的请求方法提供了别名:

laxios.get(url[, config])

laxios.delete(url[, config])

laxios.post(url[, data[, config]])

laxios.put(url[, data[, config]])

laxios.patch(url[, data[, config]])

get请求

axios.get(
            'http://www.liulongbin.top:3009/api/getbooks',
            {
                //第一个大括号表示配置信息,配置信息中有params
                //然后配置信息中的params在加一个大括号代表params的值
                params:{
                    id:1,
                }
            }
        ).then((res)=>{
            console.log(res);
        });

post请求

        axios.post(
            'http://www.liulongbin.top:3009/api/addbook',
            {
                bookname: '打哈偶的哈',
                author: '哈哈哈哈',
                publisher: '哈哈哈哈'
            },
            {
                params:{
                    id:1
                }
            }
        ).then(({ data: res }) => {
            console.log(res);
        });

其中get和delete相似,post和put,parch相似

全局配置请求根路径

在 url 地址中,协议://域名:端口 对应的部分叫做“请求根路径”。

全局配置请求根路径的好处:提高项目的可维护性。

基于 axios 提供的固定配置,即可轻松配置请求的根路径。语法格式如下:

axios.defaults.baseURL = '请求根路径'

**axios.defaults.baseURL =  "http://www.liulongbin.top:3009";

当我们配置完全局配置请求根路径后,我们写url只用写对应请求URL,请求根路径会自动加在url前面

axios拦截器

拦截器(interceptors)用来全局拦截 axios 的每一次请求与响应。

好处:可以把每个请求中,某些重复性的业务代码封装到拦截器中,提高代码的复用性。

使用场景:为每一次请求分别展示和隐藏loading(加载)效果

//拦截器代码直接在axios官方文档搜索复制来用就可以哈哈哈// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么   
    return config; 
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
​
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });

文件上传

FormData

概念:FormData 是浏览器提供的一个 WebAPI,它以键值对的方式存储数据。

作用:FormData 配合 Ajax 技术,能够向服务器发送 multipart/form-data 格式的请求体数据。

典型应用场景:FormData + Ajax 技术实现文件上传的功能。

注意:Ajax 实现文件上传的时候,请求体的编码格式必须是 multipart/form-data

FormData的基本用法

FormData 是一个构造函数,new FormData() 即可得到 FormData 对象: const fd = new FormData() 创建一个空白的 FormData 对象,里面没有包含任何数据。 调用 FormData 对象的 append(键, 值) 方法,可以向空白的 FormData 中追加键值对数据,其中:

键表示数据项的名字,必须是字符串

值表示数据项的值,可以是任意类型的数据

fd.append('username', '张三') // 键是 username,值是字符串类型

fd.append('age', 20) // 键是 age, 值是数字类型

fd.append('avatar', 图片文件) // 键是 avatar, 值是文件类型

1.基于form对象创建FormData实例对象

document.querySelector('form').addEventListener('submit', function (e) {
            e.preventDefault();
            //1.基于form对象创建FormData实例对象
            const form = document.querySelector('form');
            const fd = new FormData(form);
            console.log(...fd);
});

注意想要打印fd对象必须使用扩展运算符...才能看得到它的值

2.创建空白的FormData对象,添加数据以append方法添加数据

 const fd2 = new FormData();
            fd2.append('aaa',document.querySelector('input[type="file"]').files[0]);
       //传入的是 file上传的文件
            console.log(...fd2);

input表单中file类型上传的文件存储是以伪数组的形式存储

默认只能上传单个文件

上传多个文件需要在input里面加上 multiple

实现头像上传

主要的实现步骤:

①使用文件选择器选择图片文件

②把用户选择的文件存入 FormData 对象

③使用 axios 把 FormData 发送给服务器

④模拟文件选择器的点击事件

 <style>
    .thumb-box {
      text-align: center;
      margin-top: 50px;
    }
    .thumb {
      width: 250px;
      height: 250px;
      object-fit: cover;
      border-radius: 50%;
    }
  </style>
</head>
<body>
  <div class="thumb-box">
    <!-- 头像 -->
    <img src="./images/cover.jpg" class="img-thumbnail thumb" alt="">
    <div class="mt-2">
      <!-- 文件选择框 -->
      <!-- accept 属性表示可选择的文件类型 -->
      <!-- image/* 表示只允许选择图片类型的文件 -->
      <input type="file" id="iptFile" accept="image/*" style="display: none;">
      <!-- 选择头像图片的按钮 -->
      <button class="btn btn-primary" id="btnChoose">选择 & 上传图片</button>
    </div>
  </div>
<!-- 记得导入axios.js -->
  <script src="./lib/jquery-v3.6.0.js"></script>
  <script src="./lib/axios.js"></script>
  <script>
    axios.defaults.baseURL= 'http://www.liulongbin.top:3009';
    const file = document.querySelector('input[type=file]');
    document.querySelector('#btnChoose').addEventListener('click', function (e) {
      
      file.click();
    })
    file.onchange = function () {
      let fd = new FormData();
      fd.append('file', file.files[0]);
      console.log(fd.get('file')); 
      axios.post('/api/upload/avatar',fd).then(({data:res})=>{
        if(res.code != 200) return alert(res.message);
        console.log(res);
        // axios.get('/api/get').then(({data:res})=>{
        //   console.log(res);
        // })
        document.querySelector('.img-thumbnail').src = axios.defaults.baseURL +res.url;
      });
    }
  </script>