VUE笔记(五)网络通信

一、axios的简介

1、什么是axios

文档:Axios 中文文档 | Axios 中文网 | Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js

概念:axios是一个基于Promise的网络请求库,可以用于浏览器和node.js

特点:

  • 使用简单,包尺寸小且提供了易于扩展的接口

  • axios封装了XMLHttpRequest对象

  • 支持Promise的API

  • 可以配置拦截器来实现请求的拦截和响应拦截

  • 自动转换JSON数据

  • 取消请求

  • 批量请求

2、安装axios

npm下载方式

npm install axios

CDN方式

<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>

二、axios的基本使用

1、axios的GET请求

axios({method:'请求方式',url:'请求的url',params:{//参数}
})

2、axios的POST请求

axios的POST的语法

axios({method:'POST',url:'请求的地址',data:{//参数}
})

3、axios的DELETE请求

axios({method:'DELETE'url:'请求的地址',data:{//参数}
})
4、

4、axios的PUT请求

axios({method:'PUT'url:'请求的地址',data:{//参数}
})

三、axios高级使用

1、axios的别名的使用

  • GET方式

axios.get('请求的路径',{params:{//参数}
})
  • POST方式

axios.post('请求的路径',{//参数
})
  • DELETE方式

axios.delete('请求的路径',{data:{//参数}
})
  • PUT方式

axios.put('请求的路径',{//参数
})

2、axios的文件上传

<template><div><h1>图片上传</h1><input type="file" ref="fileEle" @change="uploadImage"><br><img :src="imagePath" alt="" style="width:150px;height:180px"></div>
</template><script>
import axios from 'axios'
export default {data(){return{imagePath:'https://img0.baidu.com/it/u=2758702403,628714391&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400'}},methods:{async uploadImage(){//创建formData对象let fd=new FormData()//将文件设置到formDatafd.append("file",this.$refs.fileEle.files[0])//进行文件的上传功能,文件上传必须使用post请求//axios默认的Content-Type的值为application/jsonlet result=await axios.post('http://www.zhaijizhe.cn:3005/images/uploadImages',fd,{headers:{'Content-Type':'multipart/form-data'}})console.log(result.data.data[0]);this.imagePath=`http://www.zhaijizhe.cn:3005/${result.data.data[0]}`}}
}
</script>

3、文件上传进度的显示和取消请求

<template><div><h1>文件上传</h1><div><input type="file" @change="uploadBigFile" ref="fileEle"><button @click="stopUpload">取消上传</button></div><div>{{progress}}%</div><div :style="`width:${progress}px;height:10px;background-color:red`"></div></div>
</template><script>
import axios from 'axios'
//从axios中解构
const {CancelToken,isCancel}=axios
export default {data(){return{progress:0}},methods:{async uploadBigFile(){//创建FormDatalet fd=new FormData()fd.append('file',this.$refs.fileEle.files[0])/* 调用axios来实现文件上传*/let result=await axios({method:'POST',url:'http://www.zhaijizhe.cn:3005/images/uploadImages',data:fd,headers:{'Content-Type':'application/multipart/form-data'},//来完成上传进度回调函数onUploadProgress:e=>{console.log(Number(e.progress*100).toFixed(2)+"%");this.progress=Number(e.progress*100).toFixed(2)},//取消上传的回调cancelToken:new CancelToken(c=>{this.cancel=c})}).catch(err=>{if(isCancel(err)){console.log('上传已经取消,取消的原因',err);}})},stopUpload(){if(this.cancel){this.cancel()}}}
}
</script><style></style>

4、axios的批量请求

在axios中一次可以发送多个请求

import axios from 'axios'
export default {methods:{async batchRequest(){let result=await axios.all([axios.get('http://www.zhaijizhe.cn:3005/students/getStudents'),axios.get('http://www.zhaijizhe.cn:3005/classes/getClasses'),axios.get('http://www.zhaijizhe.cn:3005/directors/getDirectors')])console.log(result);}}
}

5、axios的create方法

假设一种场景就是我们一个前端项目可能向多个后端发送请求,就需要多个axios实例,可以使用create方法为axios创建一个新实例,这个实例功能叫axios原本这个实例,功能没有原本axios强大

<template><div><h1>axios的create方法的使用</h1><button @click="getStudents1">查询学生信息(3005)</button><button @click="getDirector1">查询班主任信息(3005)</button><hr><button @click="getStudents2">查询学生信息(3000)</button></div>
</template><script>
import axios from 'axios'
//为axios设置基础路径
axios.defaults.baseURL="http://www.zhaijizhe.cn:3005"
//设置超时时间5000
axios.defaults.timeout=50000
//可以使用axios的create方法重新创建一个axios实例
let service=axios.create({baseURL:'http://47.98.128.191:3000',timeout:6000
})
export default {methods:{async getStudents1(){let result= await axios({method:'GET',url:'/students/getStudents'})console.log(result.data.data);},async getDirector1(){let result=await axios({method:'GET',url:'/directors/getDirectors'})console.log(result.data.data);},async getStudents2(){let result= await service({method:'GET',url:'/students/getStudents'})console.log(result);}}
}
</script><style></style>

四、axios的二次封装

1、设置基础路径

在实际开发场景我们将开发环境分为三种场景

  • 开发环境:所谓的开发环境是指程序员在开发阶段所使用的环境称为开发环境

  • 测试环境:程序在测试阶段使用使用的环境被称为测试环境

  • 生产环境:程序上线部署的环境

在配置环境,在启动的时候输入不同的命令启动不同的环境

实验:分别由三套环境 开发环境: http://localhost:3005

测试环境: http://47.98.128.191

生产环境: Express

  • 进入到package.json中配置启动脚本

"scripts": {"serve": "vue-cli-service serve","production":"set NODE_ENV=production&vue-cli-service serve","build": "vue-cli-service build"},
  • 在src目录下创建api目录,在该目录下创建request.js文件,具体的代码如下

import axios from 'axios'
//根据启动命令来决定目前使用什么环境
function getBaseURL(){switch(process.env.NODE_ENV){case 'production':return "http://www.zhaijizhe.cn:3005"default:return "http://47.98.128.191:3000"}
}
const service=axios.create({baseURL:getBaseURL()
})
export default service

2、axios的拦截器的设置

axios的拦截器分为请求拦截器和响应拦截器

请求拦截器常见的操作就是携带token,如果再发送请求的时候给每一个请求携带token到请求头之中会比较麻烦

//设置请求拦截器
service.interceptors.request.use(config=>{//设置请求拦截器//携带token信息config.headers['Authorization']="Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MGNiMDA3M2I4NGRjNWVlZGUwOWRkNzkiLCJpYXQiOjE2Njk3MTU1OTcsImV4cCI6MTY2OTcxNzM5N30.g3T5hj75XfaLhYRiNeib-aud-5X_Yw-oc9WsDbZb7TQ"return config
})

配置响应拦截器

service.interceptors.response.use(response=>{console.log('-----------正常进到响应拦截器里了--------------');console.log('response',response);//如果要将数据从响应拦截器返回到发送请求的回调中,需要使用return将这个返回对象返回return response.data
},err=>{if(err.response){switch(err.response.status){case 401:alert('您的token已经失效,请重新登录')break;case 404:alert('您输入的地址有误,请检查您的URL地址')break;case 500:alert('您的服务器有误,请与管理员联系')break}}else if(!window.navigator.onLine){alert('您的网络已断开,请检查')}
})

五、axios的规范化和模块化

1、目录解构

|-src|-api|-modules|-users.js:完成所有关于用户模块的网络请求的api|-classes.js:完成所有关于班级模块的网络请求的api|-...|-api.js:对所有模块进行汇总的js|-request.js:axios二次封装后的网络请求库

2、编写具体的业务代码

import request from '@/api/request'
//获取所有班主任的信息
const getDirectors=(params)=>{return request({method:'GET',url:'/directors/getDirectors',params})
}
//获取所有班主任信息的简写形式
//const getDirectors1=()=>request.get('/directors/getDirectors',{params})//新增班主任的信息
const addDirector=(data)=>{return request({method:'POST',url:'/directors/addDirectors',data})
}
//删除班主任信息
const deleteDirector=(_id)=>{return request({method:'DELETE',url:'/directors/deleteDirectors',data:{_id}})
}
//修改班主任信息
const updateDirectors=(data)=>{return request({method:'PUT',url:'/directors/updateDirectors',data })
}export default {getDirectors,addDirector,deleteDirector,updateDirectors
}

3、汇总模块到api.js文件中

import directors from "./modules/directors";
export default{directors
}

4、main.js中引入api.js

import api from '@/api/api'
//将api挂载到Vue的原型上
Vue.prototype.$api=api

5、组件中使用

 async getDirectors(){const result=await this.$api.directors.getDirectors(this.query)this.list=result.data.result}

六、qs.stringify的使用

Content-Type

  • application/x-www-form-urlencode

  • application/json:(axios默认的方式)

  • application/multipart/form-data

如何将JSON数据变成表单格式的数据,方式有两种

  • 如果少量的接口可以使用:qs.stringify()

  • 如果整个项目都是表单格式:可以配置拦截器

1、qs.stringify()方法

  • 下载qs依赖包

npm i qs
  • 通过qs的stringify方法来进行转换

import request from '@/api/request'
import qs from 'qs'const login=(data)=>{return request({method:'POST',url:'/login',data:qs.stringify(data)})
}
export default{login
}

注意:如果整个项目都是表单格式的数据,使用此方法会每次都要转换开发效率较低

2、在请求拦截器中统一进行设置

service.interceptors.request.use(config=>{config.headers['Content-Type']="application/x-www-form-urlencoded"return config
})

七、Fetch API

1、什么是Fetch API

Fetch被称为下一代Ajax技术,内部采用Promise方式来处理数据

FethAPI主要有如下特点

  • API语法更加简洁

  • 采用模块化设计,API分散到多个对象中

  • 采用Promise方式处理数据,避免回调地狱

    axios和fetch的不同

    1、axios底层依然是XMLHttpRequest方式,但是fetch的通讯类型是新的类型称为fetch

    2、axios实际上是封装XMLHttpRequest方法,使用的时候必须要下载axios的依赖库,然后才能使用,但是fetch是js的原生提供的,不需要导入新的依赖包

    3、发送请求的参数为body,而且还要程序员自己将json对象转成JSON字符串

    总结: fetch和axios比较起来无任何优势。

2、使用Fetch API发送GET请求

2.1、语法
fetch(url).then(...).catch(...)
2.2 、案例

1)获取所有学生列表信息

created(){fetch("http://www.zhaijizhe.cn:3005/students/getStudents").then(res=>{return res.json()}).then(res=>{this.students=res.data.result}).catch(err=>{console.log(err);})}

使用async/await的方式编写

 methods:{async getStudentsData(){let res=await fetch('http://www.zhaijizhe.cn:3005/students/getStudents')let {data:{result}}=await res.json()this.students=result}
},
created(){this.getStudentsData()
}

2)根据用户名称获取用户信息

 methods:{async getStudentsData(){let res=await fetch('http://www.zhaijizhe.cn:3005/students/getStudents?type=name&value=郭佳俊')let {data:{result}}=await res.json()console.log(result);this.students=result}
},
created(){this.getStudentsData()
}

3、使用Fetch API发送POST请求

export default {data(){return{student:{name:'zhaijizhe',age:38,gender:'男',imagePath:'http://www.zhaijizhe.cn:3005/images/1662264356815.webp',subjectsId:'60bf18ce9efaab9c2327c982',classesId:'60bf18fc9efaab9c2327c988'}}},methods:{async addStudent(){let res=await fetch('http://www.zhaijizhe.cn:3005/students/addStudents',{method:'post',headers:{'Content-Type':'application/json'},body:JSON.stringify(this.student)})let result=await res.json()console.log(result);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十一章 CUDA的NMS算子实战篇(下篇)

cuda教程目录 第一章 指针篇 第二章 CUDA原理篇 第三章 CUDA编译器环境配置篇 第四章 kernel函数基础篇 第五章 kernel索引(index)篇 第六章 kenel矩阵计算实战篇 第七章 kenel实战强化篇 第八章 CUDA内存应用与性能优化篇 第九章 CUDA原子(atomic)实战篇 第十章 CUDA流(strea…

『PyQt5-基础篇』| 04 Qt Designer的初步快速了解

04 Qt Designer的初步快速了解 1 Qt Designer入口2 Qt Designer-Widget Box2.1 窗口部件盒(Widget Box)2.2 Layouts布局2.3 Spacers间隔部件2.4 Button按钮2.5 Item Views(Model-Based)2.6 Item Widgets(Item-Based)2.7 Containers容器2.8 Input Widget输入部件2.9 Display W…

Leetcode---111双周赛

题目列表 2824. 统计和小于目标的下标对数目 2825. 循环增长使字符串子序列等于另一个字符串 2826. 将三个组排序 2827. 范围中美丽整数的数目 一、统计和小于目标的下标对数目 这题直接暴力求解&#xff0c;时间复杂度是O(n^2)&#xff0c;代码如下 class Solution { pu…

Mysql001:Mysql概述以及安装

前言&#xff1a;本课程将从头学习Mysql&#xff0c;以我的工作经验来说&#xff0c;sql语句真的太重要的&#xff0c;现在互联网所有的一切都是建立在数据上&#xff0c;因为互联网的兴起&#xff0c;现在的数据日月增多&#xff0c;每年都以翻倍的形式增长&#xff0c;对于数…

java八股文面试[多线程]——线程的生命周期

笔试题&#xff1a;画出线程的生命周期&#xff0c;各个状态的转换。 5.等待队列(本是Object里的方法&#xff0c;但影响了线程) 调用obj的wait(), notify()方法前&#xff0c;必须获得obj锁&#xff0c;也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 …

Docker容器学习:搭建ownCloud个人网盘

目录 前提环境 拉取镜像 创建容器 创建mysql容器&#xff1a; 创建OwnCloud容器&#xff0c;并连接到数据库&#xff1a; 创建Nginx容器&#xff1a; 配置nignx 前提环境 基于Centos7.9版本环境安装Docker-ce&#xff1a;24.0.5 拉取镜像 docker pull mysql:5.6 dock…

Leetcode每日一题:1267. 统计参与通信的服务器(2023.8.24 C++)

目录 1267. 统计参与通信的服务器 题目描述&#xff1a; 实现代码与解析&#xff1a; 写法一&#xff1a;两次遍历 hash 原理思路&#xff1a; 写法二&#xff1a;三次遍历 原理思路&#xff1a; 1267. 统计参与通信的服务器 题目描述&#xff1a; 这里有一幅服务器分…

Jetson Xavier NX安装torch环境

设备简介 Jetson Xavier NX是一款具有强大计算能力的AI处理器&#xff0c;它采用了NVIDIA的Turing架构和Volta GPU架构&#xff0c;可以实现高性能的深度学习和推理任务。具体性能如下&#xff1a; CPU&#xff1a;6核心ARM Cortex-A57处理器&#xff0c;最高主频1.5GHz。 GP…

平衡二叉树及其应用详解

平衡二叉树 定义与性质 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;是计算机科学中的一种数据结构&#xff0c;它是二叉排序树的一种特殊情况。 平衡二叉树满足以下性质&#xff1a; 左子树和右子树的高度差不超过 1。也就是说&#xff0c;对于任意节点&#…

6. 激活层

6.1 非线性激活 ① inplace为原地替换&#xff0c;若为True&#xff0c;则变量的值被替换。若为False&#xff0c;则会创建一个新变量&#xff0c;将函数处理后的值赋值给新变量&#xff0c;原始变量的值没有修改。 import torch from torch import nn from torch.nn import …

SQL SERVER 日期函数相关内容

最近跟日期相关的内容杠上了&#xff0c;为方便自己后期查阅&#xff0c;特地做笔记。 DECLARE chanenddate datetime----截止日期转成当天的年月日尾巴 DECLARE chanbengindate datetime----开始日期转成当天的年月日0000000 截取日期的 年月日&#xff0c;字符串类型 co…

Squaretest 1.8.3 安装激活

1. 插件下载 2. 离线安装 3. 插件激活

Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座

摘要&#xff1a;本文整理自阿里云开源大数据表存储团队负责人&#xff0c;阿里巴巴高级技术专家李劲松&#xff08;之信&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 流计算邂逅数据湖 Paimon CDC 实时入湖 Paimon 不止…

IDEA使用git

文章目录 给所有文件配置git初始化本地仓库创建.gitignore文件添加远程仓库分支操作 给所有文件配置git 初始化本地仓库 创建.gitignore文件 添加远程仓库 分支操作 新建分支 newbranch 切换分支 checkout 推送分支 push 合并分支 merge

[Ubuntu 20.04] 通过udev规则修改网卡名称(例如eth0)

在 Ubuntu 20.04 操作系统中,默认情况下,网卡接口名称采用了一种较为复杂的命名方式(如 enp0s3、eth0 等)。然而,有时候我们可能更希望使用更简洁和易于识别的名称来标识不同的网络接口。那么如何在 Ubuntu 20.04 中修改网卡接口的名称,以满足个性化需求。 步骤一:查看当…

Scala反射调用object

和反射class不同&#xff0c;反射class和java反射一样&#xff0c;object是静态代码块模式的单例&#xff0c;Scala 反射的核心是 scala.reflect.runtime.universe&#xff1a;代码如下&#xff1a; object&#xff1a; object TargetObject{def test1(name:String):String…

MySQL索引、事务与存储引擎

1索引 索引的概念&#xff1a; 数据库索引 是一个排序的列表&#xff0c;存储着索引值和这个值所对应的物理地址&#xff0c;无须对整个表进行扫描&#xff0c;通过物理地址就可以找到所需数据&#xff0c;是表中一列或者若千列值排序的方法&#xff0c;需要额外的磁盘空间 …

Linux 内核模块加载过程之重定位

文章目录 一、内核模块符号解析1.1 内核模块重定位函数调用1.1.1 struct load_info info1.1.2 copy_module_from_user 1.2 simplify_symbols1.2.1 simplify_symbols1.2.2 resolve_symbol_wait1.2.3 resolve_symbol1.2.4 find_symbol 二、 apply_relocations2.1 apply_relocatio…

2023年05月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;怪盗基德的滑翔翼 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。而他最为突出的地方&#xff0c;就是他每次都能逃脱中村警部的重重围堵&#xff0c;而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。 有一天&#xff…

计算机毕设 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 今天学长向大家介绍一个机器视觉的毕设项目&#xff0c;二维码 / 条形码检测与识别 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 1 二维码检测 物体检…