axios发送网络请求

打印 上一主题 下一主题

主题 757|帖子 757|积分 2271

本文包罗了常见的发送网络请求的方法
XMLHttpReqest

  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>案例_地区查询</title>
  8.   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
  9.   <style>
  10.     :root {
  11.       font-size: 15px;
  12.     }
  13.     body {
  14.       padding-top: 15px;
  15.     }
  16.   </style>
  17. </head>
  18. <body>
  19.   <div class="container">
  20.     <form id="editForm" class="row">
  21.       <!-- 输入省份名字 -->
  22.       <div class="mb-3 col">
  23.         <label class="form-label">省份名字</label>
  24.         <input type="text" value="北京" name="province" class="form-control province" placeholder="请输入省份名称" />
  25.       </div>
  26.       <!-- 输入城市名字 -->
  27.       <div class="mb-3 col">
  28.         <label class="form-label">城市名字</label>
  29.         <input type="text" value="北京市" name="city" class="form-control city" placeholder="请输入城市名称" />
  30.       </div>
  31.     </form>
  32.     <button type="button" class="btn btn-primary sel-btn">查询</button>
  33.     <br><br>
  34.     <p>地区列表: </p>
  35.     <ul class="list-group">
  36.       <!-- 示例地区 -->
  37.       <li class="list-group-item">东城区</li>
  38.     </ul>
  39.   </div>
  40.   <!-- <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> -->
  41.   <script>
  42.     /**
  43.      * 目标: 根据省份和城市名字, 查询对应的地区列表
  44.     */
  45.     document.querySelector('.sel-btn').addEventListener('click',()=>{
  46.         //收集省和市的值
  47.        const pname= document.querySelector('.province').value
  48.       const cname=  document.querySelector('.city').value
  49.         const obj={
  50.             pname,
  51.             cname
  52.         }
  53.         // URLSearchParams转化成查询参数
  54.         const paramsObj=new URLSearchParams(obj)
  55.         const queryString=paramsObj.toString()
  56.         //使用xhr来查询对像
  57.         const xhr=new XMLHttpRequest()
  58.         xhr.open('GET',`http://hmajax.itheima.net/api/area?${queryString}`)
  59.         xhr.addEventListener('loadend',()=>{
  60.             console.log(xhr.response)
  61.             const data=JSON.parse(xhr.response)
  62.          
  63.             const htmlStr=data.list.map(areaName=>{
  64.                 return ` <li class="list-group-item">${areaName}</li>`
  65.             }).join('')
  66.             document.querySelector('.list-group').innerHTML=htmlStr
  67.         })
  68.         xhr.send()
  69.         
  70.     })
  71.   </script>
  72. </body>
  73. </html>
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <button class="reg-btn">注册账号</button>
  10.     <style>
  11.         .reg-btn{
  12.             background-color: aquamarine;
  13.             font-size: 20px;
  14.             width: 120px;
  15.             height: auto;
  16.             border-radius: 20px;
  17.         }
  18.     </style>
  19.     <script>
  20.         document.querySelector('.reg-btn').addEventListener('click',()=>{
  21.             const xhr=new XMLHttpRequest()
  22.         xhr.open('POST','http://hmajax.itheima.net/api/register')
  23.         xhr.addEventListener('loadend',()=>{
  24.             console.log(xhr.response)
  25.         })
  26.         // 设置请求投-告诉服务器
  27.         xhr.setRequestHeader('Content-Type','application/json')
  28.         const useObj={
  29.             username:'itheima006',
  30.             password:'7654321'
  31.         }
  32.         const useStr=JSON.stringify(useObj)
  33.         //携带请求体数据
  34.         xhr.send(useStr)
  35.         })
  36.       
  37.     </script>
  38. </body>
  39. </html>
复制代码
promise

封装axios

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>Document</title>
  7. </head>
  8. <body>
  9.     <p class="my-p"></p>
  10.     <script>
  11.         function myaxios(object){
  12.            return new Promise((resolve,reject)=>{
  13.                 const xhr=new XMLHttpRequest()
  14.                 if(object.params){
  15.                     //支持参数传递
  16.                     const paramsObj=new URLSearchParams(object.params)
  17.                     const queryString=paramsObj.toString()
  18.                     //拼接参数
  19.                     object.url+=`?${queryString}`
  20.                 }
  21.                 xhr.open(object.method||'GET',object.url)
  22.                 xhr.addEventListener('loadend',()=>{
  23.                     if(xhr.status>=200&&xhr.status<300){
  24.                         resolve(JSON.parse(xhr.response))
  25.                     }
  26.                     else{
  27.                         reject(new Error(xhr.response))
  28.                     }
  29.                 })
  30.                
  31.             //判断是否有data,携带请求体
  32.             // if(object.data){
  33.             //     //转化数字类型,在send中发送
  34.             //     const jsonStr=JSON.stringify(object.data)
  35.             //     xhr.setRequestHeader('Content-Type','application/json')
  36.             //     xhr.send(jsonStr)
  37.             // }
  38.             //没有请求体
  39.                 xhr.send()
  40.             })
  41.         }
  42.         myaxios({
  43.             url:'http://hmajax.itheima.net/api/area',
  44.             method:'GET',
  45.             params:{
  46.                 pname:'北京',
  47.                 cname:'北京市'
  48.             },
  49.            
  50.             // data:{
  51.             //     username:'itheima005',
  52.             //     password:'565622'
  53.             // }
  54.             
  55.         }).then(result=>{
  56.             console.log(result)
  57.             document.querySelector('.my-p').innerHTML=result.list.join('<br>')
  58.         }).catch(error=>{
  59.             document.querySelector('.my-p').innerHTML=error.message
  60.             console.log(error)
  61.         })
  62.     </script>
  63. </body>
  64. </html>
复制代码
axios

async await

  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>async函数和await_解决回调函数地狱</title>
  8. </head>
  9. <body>
  10.   <form>
  11.     <span>省份:</span>
  12.     <select>
  13.       <option class="province"></option>
  14.     </select>
  15.     <span>城市:</span>
  16.     <select>
  17.       <option class="city"></option>
  18.     </select>
  19.     <span>地区:</span>
  20.     <select>
  21.       <option class="area"></option>
  22.     </select>
  23.   </form>
  24.   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  25.   <script>
  26.     /**
  27.      * 目标:掌握async和await语法,解决回调函数地狱
  28.      * 概念:在async函数内,使用await关键字,获取Promise对象"成功状态"结果值
  29.      * 注意:await必须用在async修饰的函数内(await会阻止"异步函数内"代码继续执行,原地等待结果)
  30.     */
  31.    async function getDate() {
  32.     try{
  33.         const pObj=await  axios({
  34.         url:'http://hmajax.itheima.net/api/province',
  35.     })
  36.     const pname=pObj.data.list[0]
  37.     console.log(pname)
  38.   const cObj= await axios ({url:'http://hmajax.itheima.net/api/city',params:{pname}})
  39.   const cname=cObj.data.list[0]
  40.     console.log(pObj)
  41.     console.log(cname)
  42.     const areaObj=await axios({url:'http://hmajax.itheima.net/api/area',params:{pname,cname}})
  43.     const anaem=areaObj.data.list[0]
  44.     console.log(anaem)
  45.    
  46.     document.querySelector('.province').innerHTML=pname
  47.     document.querySelector('.city').innerHTML=cname
  48.     document.querySelector('.area').innerHTML=anaem
  49.     }catch(error){
  50.         console.dir(error)
  51.     }
  52.   
  53.    
  54.    }
  55.    getDate()
  56.   
  57.   </script>
  58. </body>
  59. </html>
复制代码
提交图片案例

  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>图片上传</title>
  8. </head>
  9. <body>
  10.   <!-- 文件选择元素 -->
  11.   <input type="file" class="upload">
  12.   <img src="" alt="" class="my-img">
  13.   <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  14.   <script>
  15.     /**
  16.      * 目标:图片上传,显示到网页上
  17.      *  1. 获取图片文件
  18.      *  2. 使用 FormData 携带图片文件
  19.      *  3. 提交到服务器,获取图片url网址使用
  20.     */
  21.     document.querySelector('.upload').addEventListener('change',e=>{
  22.         console.log(e.target.files[0])
  23.         //使用formDate携带文件
  24.         const fd=new FormData()
  25.         fd.append('img',e.target.files[0])
  26.         //axios提交到服务器
  27.         axios({
  28.             url:'http://hmajax.itheima.net/api/uploadimg',
  29.             method:'POST',
  30.             data:fd
  31.             
  32.         }).then(result=>{
  33.             const myimg=result.data.data.url
  34.             document.querySelector('.my-img').src=myimg
  35.         })
  36.     })
  37.   </script>
  38. </body>
  39. </html>
复制代码
axios请求拦截器和响应拦截器

  1. import axios from 'axios'
  2. import { useUserStore } from '@/stores/userStore'
  3. import router from '@/router'
  4. const httpInstance=axios.create({
  5.     baseURL:'http://pcapi-xiaotuxian-front-devtest.itheima.net',
  6.     timeout:10000
  7. })
  8. //拦截器
  9. //axios拦截器
  10. httpInstance.interceptors.request.use(config=>{
  11.    
  12.     //从pinia获取token数据
  13.     const userStore=useUserStore()
  14.     //按照后端的要求拼接token数据
  15.     const token=userStore.userInfo.token
  16.     if(token){
  17.         config.headers.Authorization=`Bearer ${token}`
  18.     }
  19.     return config
  20. },e=>Promise.reject(e))
  21. //axios响应式拦截器
  22. httpInstance.interceptors.response.use(res=>res.data,e=>{
  23.     //错误提示
  24.     ElMessage({
  25.         type:'warning',
  26.         message:e.response.data.message
  27.     })
  28.     //401token失效处理
  29.     //清除本地用户数据
  30.     //跳转到登录页
  31.     const userStore=useUserStore()
  32.     if(e.response.status===401){
  33.         userStore.clearUserInfo()
  34.         router.push('/login')
  35.     }
  36.     return Promise.reject(e)
  37. })
  38. export default httpInstance
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

用户国营

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

标签云

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