ajax

226 阅读6分钟

ajax

一、ajax的介绍

数据是网页的灵魂

Ajax:在网页中利用XMLHttpRequest对象和服务器进行数据交互的方式,就是Ajax

Ajax可以轻松实现网页和服务器之间的数据交互,是一种通过js异步获取xml格式数据的技术

二、ajax的请求

ajax请求分为五种

①get请求 用于向服务器申请数据

②post请求 用于向服务器增加数据

③delete请求 用于删除服务器数据

④put请求 用于更新数据(全部)

⑤patch请求 用于更新数据(局部)

1.get

语法格式
 axios({ // 这个对象要引入axios.js文件才能使用
    method: 'get', // 请求方式
    url: 'http://www.itcbc.com:3006/api/getbooks' // 接口地址
    params:{
     // 指定查询哪条数据
     id:1 // 表示查询id为1的那条数据,多个参数是且的关系
 }
}).then(res => {
     // 请求成功后所执行的代码
 });

2.post

语法格式
 axios({ // 这个对象要引入axios.js文件才能使用
    method: 'post', // 请求方式
    url: 'http://www.itcbc.com:3006/api/addbook' // 接口地址
    data:{
     // 要添加的数据,属性名要按格式书写
 }
}).then(res => {
     // 请求成功后所执行的代码
 });

3.delete

语法格式
 axios({ // 这个对象要引入axios.js文件才能使用
    method: 'delete', // 请求方式
    url: 'http://www.itcbc.com:3006/api/delbook' // 接口地址
    params:{
     // 要删除的参数
     id:1 // 表示删除id为1的那条数据
 }
}).then(res => {
     // 请求成功后所执行的代码
 });

小tips:获取表单数据,将其转为对象格式的封装

function getForm(formSelect) {
// 传入formSelect为了选择对应的form,后面的属性选择器要加空格,表示哪个form里面的name
  const ipt = document.querySelectorAll(formSelect + ' [name]'); // 假设form的calss为f1,则传入进来拼接就变成'f1 [name]'
  const obj = {};
   // 伪数组也有foreach方法
  ipt.forEach(val => obj[val.name] = val.value); // 相当于obj['username']=11
       return obj;
}

[]表示属性选择器,[name]表示选取带有name属性的标签

4.put

axios({
   method: 'put',
   url: 'http://www.itcbc.com:3006/api/updatebook',
   data: {
       // 要修改的全部参数
   }
}).then(res => {
   // 修改后执行的代码
})

5.axios的简写

1.params类型请求的简写
// params格式是{params{参数}},[]意思是可选参数,可以不带
axios.get(url,[params]) 

2.data类型请求的简写
// 参数格式可以是对象也可以是字符串
axios.post(url,传入的数据)

三、ajax的其他拓展

1.es6快速获取表单内input数据并转换成字符串

 function getFormData(select) {
// 这个实例用于收集指定表单里的数据
 const formObj = new FormData(document.querySelector(select));
// usp实例负责处理表单数据,括号里接收要处理的对象数据
 const usp = new URLSearchParams(formObj);
// usp实例将传递过来的键值对转换成字符串
 return usp.toString();
}

2.图片的上传

 ipt.addEventListener('change', function() {
// this.files用于获取上传的文件数组
  const file = this.files[0];
// 获取浏览器内存里图片地址固定写法
  const src = URL.createObjectURL(file);
// 将地址赋值给图片的src
  img.src = src;
  const formObj = new FormData();
// formData对象所带有的append方法,通过键值对方式添加数据,avatar为传递文件的固定属性名
  formObj.append('avatar', src);
// 将formObj作为参数传递,相当于{avatar: src}
  axios.post('http://www.itcbc.com:3006/api/formdata', formObj).then(res =>                 console.log(res));
})

3.拦截器

1.请求拦截器
 // 添加请求拦截器
  axios.interceptors.request.use(
    function(config) {
    // 在发送请求之前做些什么
    return config;
  },
    function(error) {
     // 对请求错误做些什么
    return Promise.reject(error);
  }
);


2.响应拦截器
// 添加响应拦截器
   axios.interceptors.response.use(
     function(response) {
     // 服务器响应请求回来后做些什么
     return response;
   },
     function(error) {
     // 对响应错误做些什么  
     return Promise.reject(error);
   }
);

4.报文

1651146268610.png

5.状态码

1.http状态码

①2xx 表示请求成功

②3xx 表示重定向(当前网页没有所需资源,要跳转到另一个网页上获取)

③4xx 表示客户端错误

④5xx 表示服务器错误

2.业务状态码

后端自定义的状态码

http状态码和业务状态码的区别:http状态码是行业内通用的,业务状态码只在项目内,或者是公司内部通用;

http状态码只能判断你的请求有没有发送到服务器,业务状态码则是判断你请求的业务是否正常响应

6.原生的ajax代码

发送get请求

// 原生代码发送ajax请求需要new一个XMLHttpRequest对象
 const xhr = new XMLHttpRequest();
// 传递参数,原生代码get请求传递参数只能拼接到url字符上
 xhr.open('get', 'http://www.itcbc.com:3006/api/getbooks?appkey=asoul123');
// 发送请求
 xhr.send();
// 给xhr实例添加load事件,利用this.response获取返回的结果,返回的结果为字符串格式,需要通过json.parse()转成对象格式
 xhr.addEventListener('load', function() {
      const data = JSON.parse(this.response);
      console.log(data);
})
发送post请求

const xhr = new XMLHttpRequest();
xhr.open('post', 'http://www.itcbc.com:3006/api/addbook')
// 当发送post请求时,参数要写在send方法里
const data = {
   bookname: '我将埋葬众神',
   author: '见异思剑',
   publisher: '起点中文网',
   appkey: 'asoul123'
}
const usp = new URLSearchParams(data);
const str = usp.toString();// 将data从对象转换成a=1&b=2的格式
// 这里的参数格式的是字符串类型,Content-type是请求头,字符串类型的参数请求头的值为application/x-www-form-urlencoded(固定写法)
// 若参数是对象格式,需要用JSON.stringify()方法转换成json格式,请求头的值为application/json
// 若参数是formdata格式,请求头的值可以不写,浏览器会自动设置
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
xhr.send(str);
xhr.addEventListener('load', function() {
    console.log(this.response);
})

7.ajax原生代码封装

// 传入参数格式
    const data = {
        type: 'post',
        url: 'http://www.itcbc.com:3006/api/addbook',
        data: {
            bookname: '诸天尽头',
            author: '凤嘲凰',
            publisher: '起点中文网',
            appkey: '1234'
        },
        success: function(res) {
            console.log(res);
        }
    }
// 用原生ajax代码进行发送请求的封装
    function ajax({type,url,data = '',success}// 对象解构和函数默认值) {
        const xhr = new XMLHttpRequest();
        if (type === 'get') { // 当发送get请求时
            // 当data为对象格式时
        (typeof data === 'object') && (data = (new URLSearchParams(data)).toString());
            // 当data为字符串格式或者是为空
            xhr.open(type, url + '?' + data);
            xhr.send();
        } else if (type === 'post') { // 当发送post请求
            xhr.open(type, url);
            if (typeof data === 'string') { // 传入参数格式为字符串
              xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
              xhr.send(data);
            } else if (typeof data === 'object') {
                if (data instanceof FormData) { // 传入参数格式为对象,且是FormData的实例
                    xhr.send(data);
                } else { // 传入参数格式仅为对象
                    xhr.setRequestHeader('Content-type', 'application/json');
                    xhr.send(JSON.stringify(data)); // 将对象转换成json格式
                }
            }
        }
        xhr.addEventListener('load', function() {
            const obj = JSON.parse(this.response);
            success(obj);
        })
    }
    ajax(data);

8.防抖和节流

防抖
let timeid;
// 每次开启延时器前,将上一个延时器清除
clearTimeout(timeId);
// 设置延时器就是为了减少请求次数,当执行下一次请求前,先将上一个请求清除,从而实现在固定的秒数内只能发送一次请求
timeId = setTimeout(function() {
   axios.get(...) // 发送一次get请求
}, 1000)
节流
// 节流的原理就是在当前动作未完成时,禁止执行下一个动作
const btn = document.querySelector('button');
// 设置一个控制发送请求的全局变量,默认为false,即没有请求在发送
let flag = false;
btn.addEventListener('click', function() {
  // 当有请求在发送时,直接退出
  if (flag) {
     return;
  }
// 当没有请求在发送时
  if (flag === false) {
  // 将状态改为有请求发送
     flag = true;
  // 发送请求
     axios.get('http://www.itcbc.com:3006/api/getbooks?appkey=asoul123').then(res => {
          console.log('请求成功');
          // 发送完后将状态改为无请求在发送
          flag = false;
     });
   }
})