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/bootstrap@5.1.3/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/bootstrap@5.2.2/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>
相关推荐
彭世瑜几秒前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund4042 分钟前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish2 分钟前
Token刷新机制
前端·javascript·vue.js·typescript·vue
小五Five3 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序3 分钟前
vue3 封装request请求
java·前端·typescript·vue
临枫5414 分钟前
Nuxt3封装网络请求 useFetch & $fetch
前端·javascript·vue.js·typescript
前端每日三省5 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
小刺猬_9856 分钟前
(超详细)数组方法 ——— splice( )
前端·javascript·typescript
渊兮兮7 分钟前
Vue3 + TypeScript +动画,实现动态登陆页面
前端·javascript·css·typescript·动画
鑫宝Code7 分钟前
【TS】TypeScript中的接口(Interface):对象类型的强大工具
前端·javascript·typescript