ajax基础

121 阅读10分钟

ajxa 基础

异步

异步代码

1 代码是执行了,不能马上得到结果 延迟一点来执行

2 不一定按照正常上下顺序来执行代码 - 同时进行

3 异步代码 定时器和延时器

      setInterval(() => {
        document.querySelector('h1').innerText = Date.now();
      }, 10);
​
      setInterval(() => {
        document.querySelector('h2').innerText = Date.now();
      }, 10);

同步

1 代码是执行了,但是结果会马上得到

1 你同桌 给你一拳 马上就会感觉到痛

2 饮水机大水 一按下按键 水出来

3 你现在把你加 电源开关关掉 立马就断网

2 按顺序一件一件做事

1 核酸检查

排队的一个人一个人在进行

同步的代码 (以前学过的程序 绝大部分都是同步的代码 按顺序-马上得出结果

console.log( document.querySelector("body") ); // 1 有body
console.log( document.querySelector("div") ); // 2  没div

第一次获取服务器

      /* 
      想要获取服务器上的数据 url ,它是后端程序员提供  
      http://www.itcbc.com:3006/api/getbooks  图书数据 
​
      我们需要通过代码的方式  把服务器上的数据 变成 一个普通的变量 数组
      给我数组了 我就懂得如何去页面渲染了  第三方的一个js的帮助 
​
      axios
      1 下载 引入到项目中
      2 根据url的地址 来编写代码 
        1 获取数据 -get   ( 请求类型  1  get 2 post 3 delete  4 put 5 patch  )
        2 编写代码
       */
​
      //  开始向服务器 发送请求 索要数据
      axios({
        //  method:"请求类型",
        //  url:"资源地址",
        method: 'get',
        url: 'http://www.itcbc.com:3006/api/getbooks',
      }).then((result) => {
         // .then固定写法 不需要纠结
        //  如果这个代码可以触发 数据回来了
        // console.log(result); // 服务器给我们返回的数据!!
        // 数组数据
      })

第一次获取服务器

1 资源的地址 问后端要即可

2 我们负责用对 代码 确保 数据可以请求成功

3 不需要纠结 result的数据格式

只需要打印出result ,在里面 resut.data 找到数据

自己截图数据

4 把数据 存在自己的一个数组

5 使用以前教过知识把数组渲染到页面中

  axios({
            method: 'get',
            url: 'http://www.itcbc.com:3006/api/getbooks',
        }).then((result) => {
            console.log(result);
            // result 请求成功的结果
            // then 固定!! 是axios封装的一个代码  意思 服务器把数据返回了,then里           面的代码就会被触发
            // 底层套了两层data 也是后台程序员做的,不用纠结 别人怎么定义的 我只负责           如何拿对
            const arr = result.data.data; // 字段的名称 id、bookname、author。           publisher 固定
            render(arr);
        });

get post delete put parch 获取接口的五种方法

 // 获取接口 五种方法
        axios({
           
            url:''?
            请求地址
             method:'get',
            请求方式
            data:{
            请求的参数
            }
            // get 是 用来获取接口数据的 固定写法
            // 使用axios发起 get请求时 ,只需要将method:属性改为'get' url地址改           为/api/getbook'
        })
        axios({
            url:'',
            请求地址
            method:'post',
            请求方式
            data:{
            请求的参数
                
            }
            // post 是 用来新增接口数据的 固定写法
            // 使用axios发起 post请求时 ,只需要将method:属性改为'post' url地址改         为/api/addbook'
        })
        axios({
            url:''?
            请求地址
            method:'delete',
            请求方式
            data:{
            请求参数
                
            }
            // delete 是 用来删除接口数据的 固定写法
            // 使用axios发起 delete ,只需要将method:属性改为'delete' url地址改        为/api/delbook'
        })
        axios({
            url:''?
            method:'put',
            data:{     
            }
            // put 是 用来更新全部接口数据的 固定写法
        })
        axios({
            url:''?
            method:'parch',
            data:{  
            }
            // parch 是 用来更新部分接口数据的 固定写法
        })

form表单的基本使用

表单在网页中主要负责数据采集功能。HTML中的

标签,就是用于采集用户输入的信息,并通过标签的提交操作,把采集到的信息提交到服务器端进行处理。 表单由三个基本部分组成: 表单标签 表单域 表单按钮

<form>
    <input type="text" name="email_or_mobile" />
    <input type="password" name="password" />
    <input type="checkbox" name="remember_me" checked />
    <button type="submit">提交</button>
</form>
​

form标签属性

标签用来采集数据,标签的属性则是用来规定如何把采集到的数据发送到服务器。

属性描述
actionURL地址规定当提交表单时,向何处发送表单数据
methodget或post规定以何种方式把表单数据提交到 action URL
enctypeapplication/x-www-form-urlencodedmultipart/form-datatext/plain规定在发送表单数据之前如何对其进行编码
target_blank_self_parent_topframename规定在何处打开 action URL

form表单的基本使用

1 action 属性用来规定当提交表单时,向何处发送表单数据。

action 属性的值应该是后端提供的一个 URL 地址,这个 URL 地址专门负责接收表单提交过来的数据。 当 表单在未指定 action 属性值的情况下,action 的默认值为当前页面的 URL 地址。

注意:当提交表单后,页面会立即跳转到 action 属性指定的 URL 地址

2 arget 属性用来规定在何处打开 action URL。

它的可选值有5个,默认情况下,target 的值是 _self,表示在相同的框架中打开 action URL。

描述
_blank在新窗口中打开。
_self默认。在相同的框架中打开。
_parent在父框架集中打开。(很少用)
_top在整个窗口中打开。(很少用)
framename在指定的框架中打开。(很少用)

3 enctype 属性用来规定在发送表单数据之前如何对数据进行编码。

它的可选值有三个,默认情况下,enctype 的值为 application/x-www-form-urlencoded,表示在发送前编码所有的字符。

描述
application/x-www-form-urlencoded在发送前编码所有字符(默认)
multipart/form-data不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain空格转换为 “+” 加号,但不对特殊字符编码。(很少用)

业务状态码

1在检查网络中,status表示业务状态码,每个公司都不一样的*

后端自己定义的*

业务状态码用来表示这次业务处理的成功与否

2 http 表示响应式状态码 ,it行业全部通用,200等于响应成

300等于 重定义 ,400 表示前端的问题,没有获取成功,500表示后端的问题

3如果 响应式状态码 发请求给 业务状态码 ,成功了就返回200

4案列中的 响应式状态码显示为code

原生ajax

 // axios 中的 axios.get()、axios.post()、axios() 方法,都是基于 XMLHttpRequest(简称:XHR) 封装出来的
    //  创建 xhr对象
    const xhr = new XMLHttpRequest()
    //   调用open方法 指定 请求类型,url
    xhr.open('get', 'http://www.itcbc.com:3006/api/getbooks')
    xhr.send()
    //   发送出去
    xhr.addEventListener('load', function () {
      const obj = JSON.parse(this.response)
      // 字符串转对象
      console.log(obj);
    })

报文小节

        /*  1请求报文       请求报文四个组成部分
                             1请求方式 get/post
                             2请求地址 /api/getbooks
                             3  空行
                             4协议类型 http1.1版本  
        //
        // 请求头 cibtebt-type指定当前请求体数据格式
        // 请求体 发给后端的参数都放在请求体里面的 */
        /*  2 响应报文 组成的四个部分
                     1状态行  1状态码 2状态描述 3协议版本
                     2响应头  1后端让前端登录失效时机 cookie
                     3空行
                     4响应体  后端返回给前端的代码 */
        /* 3 http状态码  2xx 正常
                        3xx 重定向
                        4xx 前端的错
                        5xx 后端的错 */
​
        /* 
            4   1业务状态码  1http状态码式行内通用 2业务状态码 只是你公司通用
                2http状态在 响应报文 状态行可以看见  1业务状态码在响应主体可以看见 

原生ajax携带参数

  // 1XMLHttprequest表示 XML 格式请求
  // 2XMLHttprequest是什么?答案是浏览器内置的一个构造函数
  // 3作用:基于 new 出来的 XMLHttpRequest 实例对象,可以发起 Ajax 的请求。
  // 4axios 中的 axios.get()、axios.post()、axios() 方法,都是基于 XMLHttpRequest(简称:XHR) 封装出来的!
const xhr = new XMLHttpRequest()
      // 1 快速 写完 原生ajax的步骤
      xhr.open('get','http://www.itcbc.com:3006/api/getbooks?appkey=wanshao1234')//URL参数,只能拼接在 URL 地址 后面
​
      xhr.send() //请求体
      xhr.addEventListener('load',function(){
      console.log( (this.response));
    })

使用XML发起get请求

 /*  主要的四个实现步骤
        1 创建xhr 对象
        2 调用xhr open()函数
        3 调用xhr send()函数
        4 监听load 事件 */
        let xhr = new XMLHttpRequest()
        // new出来的XMLHttpRequest都可以发起axios请求
        xhr.open('get','http://www.itcbc.com:3006/api/xx')
        xhr.send()
        xhr.addEventListener('load',function(){
            console.log(this.response);
        })

请求时携带参数

let xhr = new XMLHttpRequest()
        xhr.open('get','http://www.itcbc.com:3006/api/addbook?name=zhangsan')
        // 可以将请求的参数拼接到url后面
        xhr.send() // = 请求体
        xhr.addEventListener('load',function(){
            console.log(this.response);
        })

请求原生ajax

  const xhr = new XMLHttpRequest()
        // 1.创建 xhr对象
        xhr.open('get','http://www.itcbc.com:3006/api/getbooks')
        // get请求只能 放在url后面进行拼接才可以
        // 2.调用open 方法指定 请求类型 和url
        xhr.send()
        // 3 发送出去send
        xhr.addEventListener('load',function(){
        // 4  监听load事件,数据响应事件
            console.log('数据回来啦');
            const obj=JSON.parse(this.response)
        /* 5   字符串转对象格式 ,因为获取回来的是一个字符串,所以要转成
            对象格式输出 */
            console.log(obj);
        })

快速写完原生ajax

 const xhr = new XMLHttpRequest()
        xhr.open('get','http://www.itcbc.com:3006/api/getbooks?appkey=wanshao1234')
        // xhr发送get请求只能 获取数据只能在url后面拼接
        xhr.send()
        xhr.addEventListener("load",function(){
            console.log(this.response);
            // 怎么拿到服务器响应回来的数据?
            //1load事件  2xhr.response
            // 因为 获取返回来的数据是以字符串形式返回的,所以需要转成对象格式
            
            
        })

原生-post-字符串格式

  /*  post 请求类型和 url 也是写在xhr.open里面,但是
         参数只能另外写 */
        // 1 a=b$c=d 同时也要指定content-type 才行
        // xhr.setRequestHeader
        // 2 对象格式 {a:'b',c:'d'}同时也需要指定content-type才行
        // 3 formdata 数据
        const data = {
            bookname: "从入门到入土",
            author: '杀人诛心',
            publisher: "杀人诛心出版社",
            appkey: 'wanshao1234'
        }
        const usp = new URLSearchParams(data)
        // 把data 转成 a=b&c=d ....  URLSearchParams 
        const query = usp.toString()
        // 把构造函数里面的内容转换成字符串格式
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
        // setRequestHeader这个是规定写法 请求头部 
        /*  'Content-type','application/x-www-form-urlencoded'
         也是规定写法 对应 上面 a=b$c=d这个格式 */
        xhr.send(query)
        // 上传要字符串形式
        // 把参数上传到send里面 因为规定请求体要在send里面写
        xhr.addEventListener('load', function () {
            console.log(this.responre);
        })

原生-post-携带参数json

  const xhr = new XMLHttpRequest()
        xhr.open('post', 'http://www.itcbc.com:3006/api/addbook')
        /*  post 请求类型和 url 也是写在xhr.open里面,但是
         参数只能另外写 */
        // 1 a=b$c=d 同时也要指定content-type 才行
        // xhr.setRequestHeader
        // 2 对象格式 {a:'b',c:'d'}同时也需要指定content-type才行
        // 3 formdata 数据
        const data = {
            bookname: "从入门到入土1",
            author: '杀人诛心1',
            publisher: "杀人诛心出版社1",
            appkey: 'wanshao1234'
        }
        // 把data 转成 a=b&c=d ....  URLSearchParams 
        // 把构造函数里面的内容转换成字符串格式
        xhr.setRequestHeader('Content-type', 'application/json')
        const query = JSON.stringify(data)
        // 把data转换成字符串
        // setRequestHeader这个是规定写法 请求头部 
        /*  'Content-type','application/x-www-form-urlencoded'
         也是规定写法 对应 上面 a=b$c=d这个格式 */
        xhr.send(query)
​
        // 把参数上传到send里面 因为规定请求体要在send里面写
        xhr.addEventListener('load', function () {
            console.log(this.responre);
        })

原生-post-携带参数 formdata

 const input = document.querySelector('input')
        input.addEventListener('change',function(){
            // 绑定change事件 当上传完图片自动触发
            const file = this.files[0]
            // 获取 input 图片数组
            const fromdata = new FormData()
            // 获取 图片地址 fromdata
            fromdata.append('avatar',file)
            // fromdata 插入 一个规定参数名,和图片数组
            const xhr = new XMLHttpRequest()
            xhr.open('post','http://www.itcbc.com:3006/api/formdata')
            // 调用formdata接口
            xhr.send(fromdata)
            xhr.addEventListener('load',function(){
                console.log(this.response);
            })
​
        })

ajax代码封装

<script src="../../jquery.js"></script>
    <!-- jq中也是封装过代码的 -->
    <script>
        // 使用了 axios 来发送ajax请求
        // 我们应该使用原生的ajax代码 来封装成 axios 调用模样 axios({url,method,params,data}).then
        $.ajax({
            url: 'http://www.itcbc.com:3006/api/getbooks',
            type: 'get',
            // jq里面获取类型 就是type
            data: 'appkey=wanshao1234',

            success(result) {
                console.log(result);
            }
        })
    /*   1 type  可能是get 也可能是post
                  2 data 3种(查询字符串 json  formdata ) */

ajax代码封装-携带 get参数

/*   1 ajax  是一个函数(正解) 还是 一个对象 
          2 它接受一个 参数 格式  什么格式(对象)
          3 需要在ajax函数中 写完 整个原生ajax 发送请求的代码  */
        const option = {
            url: 'http://www.itcbc.com:3006/api/getbooks',
            type: "get",
            data: "appkey=xxxx6666",
            seccess(result) {
                // result 等于 要等于响应的数据 =  对象格式 
                console.log(result);
            }
        }
        ajax(option)
        function ajax(config) {
            const xhr = new XMLHttpRequest()
            xhr.open(config.type, config.url + '?' + config.data)
            // 把参数传进去 必须按照这样的格式 type 到url
            xhr.send()
            xhr.addEventListener('load', function () {
                const obj = JSON.parse(this.response)
                // 要转换成对象输出,不然就是一堆字符串
                config.seccess(obj)
                // 把输出结果 传到seccess里面输出
            })

        }

ajax封装-不封装参数的问题

const option = {
            url: 'http://www.itcbc.com:3006/api/getbooks',
            type: "get",
            data: "appkey=xxxx6666",
            seccess(result) {
                // result 等于 要等于响应的数据 =  对象格式 
                console.log(result);
            }
        }
        ajax(option)

        function ajax(config) {
            console.log(config.data);
            const xhr = new XMLHttpRequest()
            if (config.data) {
                xhr.open(config.type, config.url + '?' + config.data)
            } else {
                xhr.open(config.type, config.url)
            }

            // 把参数传进去 必须按照这样的格式 type 到url
            xhr.send()
            xhr.addEventListener('load', function () {
                const obj = JSON.parse(this.response)
                // 要转换成对象输出,不然就是一堆字符串
                config.seccess(obj)
                // 把输出结果 传到seccess里面输出
            })

        }

ajax封装-默认值的问题

/*   1 ajax  是一个函数(正解) 还是 一个对象 
      2 它接受一个 参数 格式  什么格式(对象)
      3 需要在ajax函数中 写完 整个原生ajax 发送请求的代码  */
    const option = {
      url: 'http://www.itcbc.com:3006/api/getbooks',
      type: 'get',
      // data: 'appkey=wanshao1234',
      success(result) {
        console.log(result);
      },
    };
    ajax(option)
    //   把option实参赋值给ajax函数

    // ajax({
    //     url:'http://www.itcbc.com:3006/api/getbooks',
    //     type:"get",
    //     data:"appkey=xxxx6666",
    //     seccess(result){
    //         // result 等于 要等于响应的数据 =  对象格式 
    //         console.log(result);
    //     }
    // })


    function ajax(url, type, data = '', seccess) {
      // 相当于是 option.url option.type

      const xhr = new XMLHttpRequest()
      xhr.open(type, url + '?' + data)
      // xhr直接调用形参 type url
      // 注意 url后面不要加逗号


      // 把参数传进去 必须按照这样的格式 type 到url
      xhr.send()
      xhr.addEventListener('load', function () {
        const obj = JSON.parse(this.response)
        // 要转换成对象输出,不然就是一堆字符串
        seccess(obj)
        // 把输出结果 传到seccess里面输出
      })

    }

\