AJAX 1——axios体验、认识URL、常用请求方法、HTTP协议、错误处理、form-serialize插件

AJAX 1------axios体验、认识URL、常用请求方法、HTTP协议、错误处理、form-serialize插件

1.AJAX入门与体验axios

  • 定义浏览器与服务器进行数据通信的技术

  • 体验axios库,与服务器通信

    • 引入axios.js
    • 使用axios函数
    js 复制代码
    <p class="my-p"></p>
        <!-- 1.引入axios库 -->
        <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
        <script>
            // 2.使用axios函数
            axios({
                url: 'http://ajax-api.itheima.net/api/province'
            }).then(result => {
                console.log(result)
                console.log(result.data.list)
                console.log(result.data.list.join('<br>'))
                document.querySelector('.my-p').innerHTML = result.data.list.join('<br>')
            })

2.认识URL

  • URL定义:统一资源定位符,简称网址,因特网上标准的资源的地址

  • URL组成:协议://域名/资源路径

    • 协议:规定浏览器与服务器之间传输数据的格式
    • 域名:标记服务器在互联网的方位
    • 资源路径:标记资源在服务器下的具体路径
  • URL查询参数

    • 浏览器提供给服务器额外的信息,让服务器返回浏览器想要的数据

    • 语法:http://xxxx.com/xxx/xxx?参数名1=值1\&参数名2=值2

    • 使用params选项,axios在运行时会把参数名和值拼接到url?参数名=值

      js 复制代码
      <!-- 1.引入axios库 -->
          <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
          <script>
              // 2.使用axios函数
              axios({
                  url: 'http://hmajax.itheima.net/api/city',
                  params: {
                      pname: '陕西省'
                  }
              }).then(result => {
                  document.querySelector('.my-p').innerHTML = result.data.list.join('<br>')
              })
  • 案例:地区查询(通过多个参数查询)

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>04.案例_地区查询</title>
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
      <style>
        :root {
          font-size: 15px;
        }
    
        body {
          padding-top: 15px;
        }
      </style>
    </head>
    
    <body>
      <div class="container">
        <form id="editForm" class="row">
          <!-- 输入省份名字 -->
          <div class="mb-3 col">
            <label class="form-label">省份名字</label>
            <input type="text" value="北京" name="province" class="form-control province" placeholder="请输入省份名称" />
          </div>
          <!-- 输入城市名字 -->
          <div class="mb-3 col">
            <label class="form-label">城市名字</label>
            <input type="text" value="北京市" name="city" class="form-control city" placeholder="请输入城市名称" />
          </div>
        </form>
        <button type="button" class="btn btn-primary sel-btn">查询</button>
        <br><br>
        <p>地区列表: </p>
        <ul class="list-group">
          <!-- 示例地区 -->
          <li class="list-group-item">东城区</li>
        </ul>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
      <script>
        /*
          获取地区列表: 
          查询参数:
            pname: 省份或直辖市名字
            cname: 城市名字
        */
        const button = document.querySelector('button')
        button.addEventListener('click', function () {
          const list = document.querySelector('.list-group')
          const province = document.querySelector('[name=province]').value
          const city = document.querySelector('[name=city]').value
          axios({
            url: 'http://hmajax.itheima.net/api/area',
            params: {
              pname: province,
              cname: city
            }
          }).then(result => {
            // list.removeChild(document.querySelectorAll('.list-group-item'))
            console.log(result)
            const lists = result.data.list.map(function (item) {
              return `
               <li class="list-group-item">${item}</li>
               `
            }).join('')
            list.innerHTML = lists
          })
        })
      </script>
    </body>
    
    </html>

3.常用请求方法

  • Get:获取数据(默认)

  • POST:提交数据

    js 复制代码
     document.querySelector('.btn').addEventListener
          ('click', () => {
            axios({
              url: 'http://hmajax.itheima.net/api/register',
              method: 'post',
              data: {
                username: 'xxg213421',
                password: '1233432'
              }
            }).then(result => {
              console.log(result)
            })
          })
  • PUT:修改数据

  • DELETE:删除数据

  • PATCH:修改数据(部分)

  • axios请求配置:

    • url:请求的URL网址
    • method:请求的方法,GET可以省略
    • data:提交的数据

4.axios错误处理

  • 在then方法后面,通过点语法调用catch方法,传入回调函数并定义形参

    js 复制代码
    document.querySelector('.btn').addEventListener
          ('click', () => {
            axios({
              url: 'http://hmajax.itheima.net/api/register',
              method: 'post',
              data: {
                username: 'xxg213421',
                password: '1233432'
              }
            }).then(result => {
              console.log(result)
            }).catch(error => {  //处理错误信息
              console.log(error.response.data.message)
              alert(error.response.data.message)
            })
          })

5.HTTP协议

  • HTTP协议:规定了浏览器发送及服务器返回内容的格式

  • 请求报文:浏览器按照HTTP协议要求的格式,发送给服务器的内容

    • 组成部分4个:

      • 请求行请求方法,URL,协议
      • 请求头:以键值对的格式携带的附加信息,eg:Content-Type
      • 空行:分隔请求头与请求体
      • 请求体:发送的资源
    • 怎么在浏览器中查看:右键检查------>网络------>Fetch/XHR------>选择某次想要看的信息进行查看

    • 通过请求报文进行错误排查------去看报文中的载荷,以及响应结果

  • 响应报文:服务器按照HTTP协议要求的格式,返回给浏览器的格式

    • 组成部分4个:

      • 响应行协议,HTTP响应状态码,状态信息
      • 响应头:以键值对的格式携带的附加信息,eg:Content-Type
      • 空行:分隔响应头和响应体
      • 响应体:返回的资源
    • HTTP响应状态码

      状态码 说明
      1XX 信息
      2XX 成功
      3XX 重定向消息
      4XX 客户端错误(浏览器)
      5XX 服务器错误

6.接口文档

  • 定义后端 提供的描述接口的文档,接口就是使用AJAX和服务器通讯时,使用的URL,请求方法以及参数

  • 登录注册案例:(注意这里的服务器及接口是别人的,可以自己写)

    • 注册:这里的注册没有使用输入框数据,直接通过代码发送的
    js 复制代码
    <script>
        /*
          注册用户: http://hmajax.itheima.net/api/register
          请求方法: POST
          参数名:
            username: 用户名 (中英文和数字组成, 最少8位)
            password: 密码 (最少6位)
    
          目标: 点击按钮, 通过axios提交用户和密码, 完成注册
        */
        document.querySelector('.btn').addEventListener
          ('click', () => {
            axios({
              url: 'http://hmajax.itheima.net/api/register',
              method: 'post',
              data: {
                username: 'lyq20040110',
                password: '20040110'
              }
            }).then(result => {
              console.log(result)
            }).catch(error => {  //处理错误信息
              console.log(error.response.data.message)
              alert(error.response.data.message)
            })
          })
      </script>
  • 登录:和前面注册用的服务器是同一个,所以上面注册的信息可以登陆成功

    js 复制代码
    <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>12.案例_登录_提示消息</title>
      <!-- 引入bootstrap.css -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
      <!-- 公共 -->
      <style>
        html,
        body {
          background-color: #EDF0F5;
          width: 100%;
          height: 100%;
          display: flex;
          justify-content: center;
          align-items: center;
        }
    
        .container {
          width: 520px;
          height: 540px;
          background-color: #fff;
          padding: 60px;
          box-sizing: border-box;
        }
    
        .container h3 {
          font-weight: 900;
        }
      </style>
      <!-- 表单容器和内容 -->
      <style>
        .form_wrap {
          color: #8B929D !important;
        }
    
        .form-text {
          color: #8B929D !important;
        }
      </style>
      <!-- 提示框样式 -->
      <style>
        .alert {
          transition: .5s;
          opacity: 0;
        }
    
        .alert.show {
          opacity: 1;
        }
      </style>
    </head>
    
    <body>
      <div class="container">
        <h3>欢迎-登录</h3>
        <!-- 登录结果-提示框 -->
        <div class="alert alert-success" role="alert">
          提示消息
        </div>
        <!-- 表单 -->
        <div class="form_wrap">
          <form>
            <div class="mb-3">
              <label for="username" class="form-label">账号名</label>
              <input type="text" class="form-control username">
            </div>
            <div class="mb-3">
              <label for="password" class="form-label">密码</label>
              <input type="password" class="form-control password">
            </div>
            <button type="button" class="btn btn-primary btn-login"> 登 录 </button>
          </form>
        </div>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
      <script>
        // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
        // 目标2:使用提示框,反馈提示消息
        //获取提示框
        //功能:
        //1.显示提示框
        //2.不同提示文字,成功绿色不成功红色
        //3.两秒后自动消失
        const myAlert = document.querySelector('.alert')
        function alertFn(isSuccess, msg) {
          myAlert.classList.add('show')
          myAlert.innerHTML = msg
          const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
          myAlert.classList.add(bgStyle)
          setTimeout(() => {
            myAlert.classList.remove('show')
            //重置背景色
            myAlert.classList.remove(bgStyle)
          }, 2000)
        }
        // 1.1 登录-点击事件
        document.querySelector('.btn-login').addEventListener('click', () => {
          // 1.2 获取用户名和密码
          const username = document.querySelector('.username').value
          const password = document.querySelector('.password').value
          // console.log(username, password)
    
          // 1.3 判断长度
          if (username.length < 8) {
            console.log('用户名必须大于等于8位')
            alertFn(false, '用户名必须大于等于8位')
            return // 阻止代码继续执行
          }
          if (password.length < 6) {
            console.log('密码必须大于等于6位')
            alertFn(false, '密码必须大于等于6位')
            return // 阻止代码继续执行
          }
    
          // 1.4 基于axios提交用户名和密码
          // console.log('提交数据到服务器')
          axios({
            url: 'http://hmajax.itheima.net/api/login',
            method: 'POST',
            data: {
              username,
              password
            }
          }).then(result => {
            console.log(result)
            console.log(result.data.message)
            alertFn(true, '登陆成功')
    
    
          }).catch(error => {
            console.log(error)
            console.log(error.response.data.message)
            alertFn(false, '用户名或密码不正确')
    
          })
        })
      </script>
    </body>
    </html>

7.form-serialize插件

  • 作用:快速收集表单元素的值
js 复制代码
<body>
  <form action="javascript:;" class="example-form">
    <input type="text" name="uname">
    <br>
    <input type="text" name="pwd">
    <br>
    <input type="button" class="btn" value="提交">
  </form>
  <!-- 
    目标:在点击提交时,使用form-serialize插件,快速收集表单元素值
  -->
  <!-- 引入插件 -->
  <script src="./form-serialize.js"></script>
  <script>
    document.querySelector('.btn').addEventListener('click', () => {
      // 使用serialize函数
      const form = document.querySelector('.example-form')
      //参数1:获取哪个表单参数 
      //**表单属性要设置name值,值会作为对象的属性名
      //**建议name属性的值和接口文档参数名一致 
      //参数2:配置对象
      //**hash:设置获取的数据结构------推荐为true
      //****true:JS对象
      //****false:查询字符串------推荐为true
      //**empty:是否获取空值
      const data = serialize(form, { hash: true, empty: true })
      console.log(data)

    })
  </script>
</body>
</html>
相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰10 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪10 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪10 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy11 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom11 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom12 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom12 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom12 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试