AJAX 入门 day1 ajax先容、axios利用、URL、哀求方法、数据提交、HTTP协议- ...

打印 上一主题 下一主题

主题 766|帖子 766|积分 2298

目录
1.AJAX 概念和 axios 利用
2.熟悉 URL
3.URL 查询参数
4.常用哀求方法和数据提交
5.HTTP协议-报文
5.1 HTTP 协议-哀求报文
5.2 HTTP 协议-响应报文
6.接口文档
7.案例 - 用户登录
8.form-serialize 插件


1.AJAX 概念和 axios 利用


“Ajax” 是 “Asynchronous(异步) JavaScript and XML” 的缩写,是一种用于创建动态网页的技能。它允许网页在不重新加载整个页面的情况下与服务器进行交互和更新内容,从而提高用户体验和页面的响应速度。

Ajax 的基本工作流程是:

  • 用户在网页上触发事件(如点击按钮)。
  • JavaScript 代码利用 XMLHttpRequest 对象向服务器发送哀求。
  • 服务器处置处罚哀求并返回数据。
  • JavaScript 代码处置处罚返回的数据,并更新页面内容,而无需重新加载整个页面。

怎么用 AJAX ?
   1.   先利用   axios   [æk‘sio  ʊ  s]   库,  与服务器进行  数据通讯   

  • 基于 XMLHttpRequest 封装、代码简单、月下载量在 14 亿次
  • Vue、React 项目中都会用到 axios
   2.   再学习 XMLHttpRequest 对象的利用,相识 AJAX 底层原理  

   语法:      1.   引入 axios.js:  https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js      2.   利用 axios 函数   

  • ✓ 传入配置对象
  • ✓ 再用 .then 回调函数接收结果,并做后续处置处罚


训练:
   需求:哀求目标资源地址,拿到省份列表数据,表现到页面      目标资源地址:  http://hmajax.itheima.net/api/province     
      代码:   
  1. <body>
  2.     <p></p>
  3.     <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  4.     <script>
  5.         /* 通过后台数据渲染到页面 */
  6.         const p = document.querySelector('p')
  7.         axios({
  8.             url: 'https://hmajax.itheima.net/api/province'
  9.         }).then(result => {
  10.             // console.log(result)
  11.             // console.log(result.data.list)
  12.             p.innerHTML = result.data.list.join('<br>')
  13.         })
  14.     </script>
  15. </body>
复制代码


   2.熟悉 URL

  
  URL,即统一资源定位符(Uniform Resource Locator),是用来指定互联网资源位置的地址。
  一个典范的 URL 由以下几个部分组成:
  

  • 协议(Protocol):指定利用的网络协议,例如 http、https、ftp 等。比如 https:// 表示利用安全的 HTTP 协议。
  • 域名(Domain Name):表示资源地点的服务器的名称,例如 www.example.com。
  • 端口号(Port)(可选):指定服务器上用于通讯的端口。例如,http://example.com:8080 指的是端口号为 8080 的服务器。
  • 资源路径(Path):指向服务器上特定的资源或文件的位置。例如 /path/to/resource。
  • 查询字符串(Query String)(可选):提供附加的参数或数据,通常以 ? 开始。例如 ?key1=value1&key2=value2。
  • 锚点(Fragment)(可选):指向页面内部的某个部分或位置,通常以 # 开始。例如 #section1。
  一个完备的 URL 大概如下所示:
  1. https://www.example.com:8080/path/to/resource?key1=value1&key2=value2#section1
复制代码

  最常见的URL是这样的:
  

  参数说明:
  

  • http 协议:超文本传输协议,规定欣赏器和服务器之间传输数据的格式
     

  • 域名:标记服务器在互联网中方位
      

  • 资源路径:标记资源在服务器下的具体位置
      
  
  3.URL 查询参数

  
     定义:欣赏器提供给服务器的   额外信息   ,让服务器返回欣赏器想要的数据          语法:http://xxxx.com/xxx/xxx   ?   参数名1=值1   &   参数名2=值2   
  

  
     语法:利用 axios 提供的    params    选项          注意:axios 在运行时把参数名和值,会拼接到 url   ?参数名=值          都会列表:   http://hmajax.itheima.net/api/city?pname=河北省   
  

  
     案例:         地域查询         需求:根据输入的省份名字和都会名字,查询地域并渲染列表         效果图:         
         代码:         
  1. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  2.   <script>
  3.     /*
  4.       获取地区列表: http://hmajax.itheima.net/api/area
  5.       查询参数:
  6.         pname: 省份或直辖市名字
  7.         cname: 城市名字
  8.     */
  9.     const btn = document.querySelector('.sel-btn')
  10.     btn.addEventListener('click', function () {
  11.       // 获取表单数据
  12.       pName = document.querySelector('.province').value
  13.       cName = document.querySelector('.city').value
  14.       // console.log(11)
  15.       // console.log(cname)
  16.       axios({
  17.         url: 'https://hmajax.itheima.net/api/area',
  18.         params: {
  19.           pname: pName,
  20.           cname: cName
  21.         }
  22.       }).then(result => {
  23.         // console.log(result.data.list)
  24.         document.querySelector('.list-group').innerHTML = result.data.list.map(item => {
  25.           return `
  26.             <li class="list-group-item">${item}</li>
  27.           `
  28.         }).join('')
  29.       })
  30.     })
  31.   </script>
复制代码
  
        4.常用哀求方法和数据提交

  
     哀求方法:对服务器   资源   ,要实行的   操作         
           利用场景:   当数据需要在服务器上   生存         
   
  案例:
     数据提交-注册账号   
     需求:通过 axios 提交用户名和密码,完成注册功能          注册用户 URL 地址:   http://hmajax.itheima.net/api/register          哀求方法:   POST          参数名:        username    用户名(中英文和数字组成,最少 8 位)        password    密码(最少 6 位)   
  代码:
  1. <body>
  2.   <button class="btn">注册用户</button>
  3.   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  4.   <script>
  5.     /*
  6.       注册用户: http://hmajax.itheima.net/api/register
  7.       请求方法: POST
  8.       参数名:
  9.         username: 用户名 (中英文和数字组成, 最少8位)
  10.         password: 密码 (最少6位)
  11.       目标: 点击按钮, 通过axios提交用户和密码, 完成注册
  12.     */
  13.     const btn = document.querySelector('.btn')
  14.     btn.addEventListener('click', function () {
  15.       axios({
  16.         url: 'http://hmajax.itheima.net/api/register',
  17.         method: 'POST',
  18.         data: {
  19.           username: 'linhanxin',
  20.           password: '123456'
  21.         }
  22.       }).then(result => {
  23.         console.log(result)
  24.         //获取错误信息,显示给用户看
  25.       }).catch(error => {
  26.         alert(error.response.data.message)
  27.       })
  28.     })
  29.   </script>
  30. </body>
复制代码

  axios错误处置处罚,可以让客户端更直观看到错误信息。从而去修改。
  捕捉到的 error 是一个错误对象。
  
  
  5.HTTP协议-报文
 


  5.1 HTTP 协议-哀求报文

  
     HTTP 协议:规定了欣赏器发送及服务器返回内容的   格式          哀求报文   :欣赏器按照 HTTP 协议要求的   格式   ,发送给服务器的   内容         
   
     哀求报文的组成部分有:     

  • 1. 哀求行:哀求方法,URL,协议
  • 2. 哀求头:以键值对的格式携带的附加信息,比如:Content-Type
  • 3. 空行:分隔哀求头,空行之后的是发送给服务器的资源
  • 4. 哀求体:发送的资源
  
  
  5.2 HTTP 协议-响应报文

  
     HTTP 协议:规定了欣赏器发送及服务器返回内容的   格式          响应报文   :服务器按照 HTTP 协议要求的   格式   ,   返回给欣赏器的   内容          响应报文的组成部分有:   

  • 1. 响应行(状态行):协议、HTTP 响应状态码、状态信息
  • 2. 响应头:以键值对的格式携带的附加信息,比如:Content-Type
  • 3. 空行:分隔响应头,空行之后的是服务器返回的资源
  • 4. 响应体:返回的资源
     
      
     HTTP 响应状态码             HTTP 响应状态码:用来表明哀求    是否成功    完成              比如:    404(服务器找不到资源)            
            6.接口文档

  
     接口文档   :   描述   接口   的文章    (后端工程师)          接口   :利用 AJAX 和服务器通讯时,   利用的    URL   ,   哀求方法   ,   以及参数          传送门   :https://apifox.com/apidoc/shared-1b0dd84f-faa8-435d-b355-5a8a329e34a8   
  

  
  通过接口文档,就可以根据里面的需求来实现代码。
  
  
  7.案例 - 用户登录

  
     案例-用户登录      

  • 1. 点击登录时,判断用户名和密码长度
  • 2. 提交数据和服务器通讯
  • 3. 提示信息

    • 并且实现成功或者失败返回差别颜色的提示框

  

  

  
  代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.   <title>11.案例_登录</title>
  8.   <!-- 引入bootstrap.css -->
  9.   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
  10.   <!-- 公共 -->
  11.   <style>
  12.     html,
  13.     body {
  14.       background-color: #EDF0F5;
  15.       width: 100%;
  16.       height: 100%;
  17.       display: flex;
  18.       justify-content: center;
  19.       align-items: center;
  20.     }
  21.     .container {
  22.       width: 520px;
  23.       height: 540px;
  24.       background-color: #fff;
  25.       padding: 60px;
  26.       box-sizing: border-box;
  27.     }
  28.     .container h3 {
  29.       font-weight: 900;
  30.     }
  31.   </style>
  32.   <!-- 表单容器和内容 -->
  33.   <style>
  34.     .form_wrap {
  35.       color: #8B929D !important;
  36.     }
  37.     .form-text {
  38.       color: #8B929D !important;
  39.     }
  40.   </style>
  41.   <!-- 提示框样式 -->
  42.   <style>
  43.     .alert {
  44.       transition: .5s;
  45.       opacity: 0;
  46.     }
  47.     .alert.show {
  48.       opacity: 1;
  49.     }
  50.   </style>
  51. </head>
  52. <body>
  53.   <div class="container">
  54.     <h3>欢迎-登录</h3>
  55.     <!-- 登录结果-提示框 -->
  56.     <div class="alert alert-success" role="alert">
  57.       提示消息
  58.     </div>
  59.     <!-- 表单 -->
  60.     <div class="form_wrap">
  61.       <form>
  62.         <div class="mb-3">
  63.           <label for="username" class="form-label">账号名</label>
  64.           <input type="text" class="form-control username">
  65.         </div>
  66.         <div class="mb-3">
  67.           <label for="password" class="form-label">密码</label>
  68.           <input type="password" class="form-control password">
  69.         </div>
  70.         <button type="button" class="btn btn-primary btn-login"> 登 录 </button>
  71.       </form>
  72.     </div>
  73.   </div>
  74.   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  75.   <script>
  76.     // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
  77.     //  不要盲目写代码,先写需求,然后再翻译成代码
  78.     const btn = document.querySelector('.btn-login')
  79.     const admin = document.querySelector('.alert')
  80.     btn.addEventListener('click', () => {
  81.       const username = document.querySelector('.username').value
  82.       const password = document.querySelector('.password').value
  83.       // 封装函数,提示用户登录状态
  84.       function status(mes, flag) {
  85.         // 1.显示提示框
  86.         admin.classList.add('show')
  87.         // 2.实现细节
  88.         admin.innerHTML = mes
  89.         const bgStyle = flag ? 'alert-success' : 'alert-danger'
  90.         admin.classList.add(bgStyle)
  91.         // 3.提示两秒后消失
  92.         timeOut = setTimeout(function () {
  93.           admin.classList.remove('show')
  94.           admin.classList.remove(bgStyle)
  95.         }, 2000)
  96.       }
  97.       if (username.length < 8) {
  98.         console.log('账户不能少于8位')
  99.         status('账户不能少于8位', false)
  100.         // 不满足条件就返回,不要往下执行
  101.         return
  102.       }
  103.       if (password.length < 6) {
  104.         console.log('密码不能少于6位')
  105.         status('密码不能少于6位', false)
  106.         // 不满足条件就返回,不要往下执行
  107.         return
  108.       }
  109.       // console.log(11)
  110.       axios({
  111.         url: 'http://hmajax.itheima.net/api/login',
  112.         method: 'POST',
  113.         // 属性名和属性值的变量名一样可以简写
  114.         data: {
  115.           username,
  116.           password
  117.         }
  118.       }).then(result => {
  119.         // 打印对象
  120.         console.log(result.data.message)
  121.         status(result.data.message, true)
  122.       }).catch(error => {
  123.         // 捕捉错误信息
  124.         console.log(error.response.data.message)
  125.         status(error.response.data.message, false)
  126.       })
  127.     })
  128.   </script>
  129. </body>
  130. </html>
复制代码

  
  8.form-serialize 插件

  
     作用:   快速   收集表单元素的值         
   
  利用:
  

  • 1.引入form-serialize 插件的 js文件
  • 2.通过调用serialize(表单,对象)函数来实现

    • 利用serialize函数,快速收集表单元素的值
             * 参数1:要获取哪个表单的数据
             *  表单元素设置name属性,值会作为对象的属性名

             * 参数2:配置对象
             *  hash 设置获取数据布局
             *    - true:JS对象(推荐)一般哀求体里提交给服务器
             *    - false: 查询字符串(username="Xxx" & )
             *  empty 设置是否获取空值
             *    - true: 获取空值(推荐)数据布局和标签布局同等
             *    - false:不获取空值

  代码演示:
  1. <body>
  2.   <form action="javascript:;" class="example-form">
  3.     <input type="text" name="uname">
  4.     <br>
  5.     <input type="text" name="pwd">
  6.     <br>
  7.     <input type="button" class="btn" value="提交">
  8.   </form>
  9.   <!--
  10.     目标:在点击提交时,使用form-serialize插件,快速收集表单元素值
  11.   -->
  12.   <!-- 引入插件的js -->
  13.   <script src="./lib/form-serialize.js"></script>
  14.   <script>
  15.     document.querySelector('.btn').addEventListener('click', () => {
  16.       // 获取表单对象
  17.       const form = document.querySelector('.example-form')
  18.          /**
  19.        * 2. 使用serialize函数,快速收集表单元素的值
  20.        * 参数1:要获取哪个表单的数据
  21.        *  表单元素设置name属性,值会作为对象的属性名
  22.        *  建议name属性的值,最好和接口文档参数名一致
  23.        * 参数2:配置对象
  24.        *  hash 设置获取数据结构
  25.        *    - true:JS对象(推荐)一般请求体里提交给服务器
  26.        *    - false: 查询字符串(username="Xxx" & )
  27.        *  empty 设置是否获取空值
  28.        *    - true: 获取空值(推荐)数据结构和标签结构一致
  29.        *    - false:不获取空值
  30.       */
  31.       const data = serialize(form, { hash: true, empty: true })
  32.       console.log(data)
  33.     })
  34.   </script>
  35. </body>
复制代码

     案例-用户登录             利用 form-serialize 插件,    收集    用户名和密码            
      
  代码实现:
  1. <body>
  2.   <div class="container">
  3.     <h3>欢迎-登录</h3>
  4.     <!-- 登录结果-提示框 -->
  5.     <div class="alert alert-success" role="alert">
  6.       提示消息
  7.     </div>
  8.     <!-- 表单 -->
  9.     <div class="form_wrap">
  10.       <form class="login-form">
  11.         <div class="mb-3">
  12.           <label for="username" class="form-label">账号名</label>
  13.           <input type="text" class="form-control username" name="username">
  14.         </div>
  15.         <div class="mb-3">
  16.           <label for="password" class="form-label">密码</label>
  17.           <input type="password" class="form-control password" name="password">
  18.         </div>
  19.         <button type="button" class="btn btn-primary btn-login"> 登 录 </button>
  20.       </form>
  21.     </div>
  22.   </div>
  23.   <script src="./lib/form-serialize.js"></script>
  24.   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  25.   <script>
  26.     // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
  27.     // 目标2:使用提示框,反馈提示消息
  28.     // 目标3:使用form-serialize插件,收集用户名和密码
  29.     // 2.1 获取提示框
  30.     const myAlert = document.querySelector('.alert')
  31.     /**2.2 封装提示框函数,重复调用,满足提示需求
  32.      * 功能:
  33.      * 1. 显示提示框
  34.      * 2. 不同提示文字msg,和成功绿色失败红色isSuccess(true成功,false失败)
  35.      * 3. 过2秒后,让提示框自动消失
  36.     */
  37.     function alertFn(msg, isSuccess) {
  38.       // 1> 显示提示框
  39.       myAlert.classList.add('show')
  40.       // 2> 实现细节
  41.       myAlert.innerText = msg
  42.       const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
  43.       myAlert.classList.add(bgStyle)
  44.       // 3> 过2秒隐藏
  45.       setTimeout(() => {
  46.         myAlert.classList.remove('show')
  47.         // 提示:避免类名冲突,重置背景色
  48.         myAlert.classList.remove(bgStyle)
  49.       }, 2000)
  50.     }
  51.     // 1.1 登录-点击事件
  52.     document.querySelector('.btn-login').addEventListener('click', () => {
  53.       // 1.2 获取用户名和密码
  54.       // 获取表单对象
  55.       const form = document.querySelector('.login-form')
  56.       // 利用serialize插件来实现获取表单的值
  57.       const data = serialize(form, { hash: true, empty: true })
  58.       // 利用解构简化开发
  59.       const { username, password } = data
  60.       console.log(data)
  61.       // const username = document.querySelector('.username').value
  62.       // const password = document.querySelector('.password').value
  63.       // console.log(username, password)
  64.       // 1.3 判断长度
  65.       if (username.length < 8) {
  66.         alertFn('用户名必须大于等于8位', false)
  67.         console.log('用户名必须大于等于8位')
  68.         return // 阻止代码继续执行
  69.       }
  70.       if (password.length < 6) {
  71.         alertFn('密码必须大于等于6位', false)
  72.         console.log('密码必须大于等于6位')
  73.         return // 阻止代码继续执行
  74.       }
  75.       // 1.4 基于axios提交用户名和密码
  76.       // console.log('提交数据到服务器')
  77.       axios({
  78.         url: 'http://hmajax.itheima.net/api/login',
  79.         method: 'POST',
  80.         data: {
  81.           username,
  82.           password
  83.         }
  84.       }).then(result => {
  85.         alertFn(result.data.message, true)
  86.         console.log(result)
  87.         console.log(result.data.message)
  88.       }).catch(error => {
  89.         alertFn(error.response.data.message, false)
  90.         console.log(error)
  91.         console.log(error.response.data.message)
  92.       })
  93.     })
  94.   </script>
  95. </body>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表