ajax学习笔记

Ajax

概念

一种使用js来异步获取xml格式数据的技术

请求方式

  1. 操作服务器上的数据除了需要使用url地址,还需要指定请求方式
  2. 操作服务器上的数据时
    1. 获取服务器上的数据,需要GET
    2. 新增数据,需要POST
    3. 删除数据,需要DELETE
    4. 完整修改(更新)数据,需要PUT
    5. 修改(更新)部分数据,需要PATCH

axios

说明

  • 是前端最火的,专注于数据请求的库

使用方式

  1. 引入axios

  2. 数据查询

    axios({
        method:'get',//请求类型
        url:'',//请求地址
        params:{//查询参数
            id:1
        },//查询id=1的数据
    }).then((result)=>{
     console.log(result);
    });
    
    //简写形式1
    axios.get(url,{params:{参数}}).then(result => {
        console.log(result)
    })
    //简写形式2----拼接url
    axios.get(url).then(result => {
        console.log(result)
    })
    
  3. 数据添加

    axios({
        method:'POST',//请求类型
        url:'',//请求地址
        data: {
            bookname: 'xx',
            author: 'xx',
            publisher: 'xx'
        }
    }).then((result)=>{
        console.log(result);
    });
    
    //POST请求中,data还可以接收字符串格式类型
    axios({
        method:'POST',//请求类型
        url:'',//请求地址
        data: 'bookname=xx&author=xx&publisher=xx'
    }).then((result)=>{
        console.log(result);
    });
    
    //简写形式1
    axios.post(url,{参数}).then(result => {
        console.log(result)
    })
    //简写形式2 -- 参数 = bookname=xx&author=xx&publisher=xx
    axios.post(url,'参数').then(result => {
        console.log(result)
    })
    
  4. 数据删除

    axios({
                method: "DELETE",
                url: "",//请求地址
                params: {
                    //请求参数
                },
              }).then((result) => {
                console.log(result);
              });
    
  5. 数据修改

    axios({
                method: "patch",
                url: "",//请求地址
                data: {
                    //请求参数
                },
              }).then((result) => {
                console.log(result);
              });
    

序列化

  • 是一个把对象或者数组转成字符串格式的过程 如JSON.stringfy()

反序列化

  • 是一个把字符串格式转成对象或者数组的过程 如 JSON.parse()

获取表单内input的值

  1. 普通方法

    //query 只能传入 form标签的选择器
    function getForm(query){
        const inputs = document.querySelectorAll(query + ' input[name]');
        const obj = {};
        inputs.forEach(item => {
            obj[item.name] = item.value;
        });
        return obj;
    }
    
  2. 使用JQ

    //$('表单元素的选择器').serialize()
    const data = $('form').serialize()
    console.log(data)// key1=value1&key2=value2
    
  3. 自己实现

    //formdata 碰到多选框时不适合使用 
    const formDom = document.querySelector("form");
          const btnDom = document.querySelector("button");
          btnDom.addEventListener("click", () => {
            const formData = new FormData(formDom);
            //以url拼接参数返回
            const usp = new URLSearchParams(formData);
            console.log(usp.toString()); //username=XianCheng666&password=123513215
            //以对象的形式返回
            const obj = {};
            formData.forEach((value, key) => {
              obj[key] = value;
            });
            console.log(obj); //{username: 'q964813950', password: '543243'}
          });
    

上传图片

//<input type="file" accept="image/*"/>
//<img src=''/>

const input = document.querySelector('input');
const img = document.querySelector('img');
input.addEventListener('change',()=>{
    const file = input.files[0];//要上传的文件对象
    const src = URL.createObjectURL(file);//把浏览器内存中图片文件的地址获取出来
    img.src = src;
    
    const formdata = new FormData();//创建一个空formdata对象
    formdata.append('avatar',file);//接口要求,把文件追加到 formdata对象
    axios.post(url,formdata).then(result =>{
        console.log(result);
    });
});

拦截器

定义

是用来全局拦截axios的每一次请求与响应

使用

  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)
        }
    )
    

请求报文

定义

  • 规定了客户端以什么格式把数据发送给服务器
  • 请求报文由请求行,请求头,请求体组成
  • 请求行:请求方式 请求地址 协议类型
  • 请求头: 用来描述这次请求的基本信息
  • 请求体:要发送给服务器的数据

响应报文

定义

  • 规定了服务器以什么格式把数据响应给客户端
  • 由状态行,响应头部,响应体组成

http响应状态码

  • 2xx-----成功
  • 3xx----重定向
  • 4xx----客户端错误,即代码错误
  • 5xx----后端错误

axios的实现原理

基本写法

//1 创建xhr对象
const xhr = new XMLHttpRequest();
//2 调用open方法
xhr.open('请求类型','请求地址');
//3 发送出去
xhr.send();
//4 监听 数据响应事件
xhr.addEventListener('load',function(){
    console.log(this.response);
    //字符串转对象
    const obj = JSON.parse(this.response);
    console.log(obj);
});

原生携带参数的GET请求

const xhr = new XMLHttpRequest();
xhr.open('get','请求地址?请求参数1&请求参数2');//见注1
xhr.send();
xhr.addEventListener('load',function(){
    console.log(this.response);
    const obj = JSON.parse(this.response);
    console.log(obj);
});

//注1    请求参数n格式:key=value

原生携带参数的POST请求

const xhr = new XMLHttpRequest();
xhr.open('post','请求地址');
const data = {
        bookname: '1从入门到精通1',
        author: '我自己',
        publisher: '黑马出版社',
        appkey: 'wanshao1234',
      };
//把data转成 a=b&c=d   URLSearchParams
const usp = new URLSearchParams(data);
const query = usp.toString();
//设置对应的content-type
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//传递 a=b&c=d 
xhr.send(query);
xhr.addEventListener('load',function(){
    console.log(this.response);
    const obj = JSON.parse(this.response);
    console.log(obj);
});

原生-POST-携带参数JSON格式字符串

const xhr = new XMLHttpRequest();
xhr.open('post','请求地址');
const data = {
        bookname: '1从入门到精通1',
        author: '我自己',
        publisher: '黑马出版社',
        appkey: 'wanshao1234',
      };
//设置对应的content-type
xhr.setRequestHeader("Content-type","application/json");
const str =JSON.stringify(data);
xhr.send(str);
xhr.addEventListener('load',function(){
    console.log(this.response);
    const obj = JSON.parse(this.response);
    console.log(obj);
});

原生-POST-携带参数formdata

const input = document.querySelector('input');
      input.addEventListener('change', function () {
        const file = this.files[0];//获取要上传文的件对象
        const formdata = new FormData();
        //添加key value
        formdata.append('avatar', file);
        const xhr = new XMLHttpRequest();
        xhr.open('post', 'http://www.itcbc.com:3006/api/formdata');
        // 不用设置 content-type
        xhr.send(formdata);
        xhr.addEventListener('load', function () {
          console.log(this.response);
        });
      });

防抖和节流

防抖

  • 定义

    频繁触发某个操作是,只执行最后一次

  • 个人理解

    有一个异步操作fun(),他的执行过程是A->B->C,我的需求是点击十次,除非某一次执行了完整过程,那么只有最后一次点击执行该操作

  • 代码

    let id = null
    btn.addEventlistenner('click',() => {
        clearTimeout(id);//清除之前的定时器
        id = setTimeout(()=>{
            //相关需求。。
        },500)
    })
    

节流

  • 定义

    单位时间内,频繁触发同一个操作,只会触发一次(第一次)

  • 代码

    let flag = true //表示可以执行
    
    btn.addEventlistenner('click',() => {
        if (!flag) return;
        flag = false;
       	//相关异步操作
        //如果执行成功则使flag = true
    })
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值