完整过一遍axios,再也不怕写请求
axios请求方法
主要有get,post,put,patch,delete
-
get
获取数据
-
post
提交数据(表单提交+文件上传)
-
put
更新数据(将所有数据均推放到服务端)
-
patch
更新数据(只将修改的数据推送到后端)
-
dlelete
删除数据
get方法
写法
调用型
axios.get('/data.json').then((res)=>{ console.log(res) }) 复制代码
axios()型
axios({ method:'get', url:'/data.json' }).then((res)=>{ console.log(res) }) 复制代码
params
如果我们需要加载 : http://localhost:8080/data.json?id=12,应该如何去获取呢?
调用型
axios.get('/data.json',{ params:{ id:12 } }).then((res)=>{ console.log(res) }) 复制代码
axios()方法型
axios({ method:'get', url:'/data.json', params:{ id:12 } }).then((res)=>{ console.log(res) }) 复制代码
post方法
写法
调用型
axios.post('/post',{},config) 复制代码
post方法有三个参数,分别是url、数据、config。config参数暂时不讨论。
一般上传的数据分两种
- form-data 表单提交(图片上传、文件上传)
- application/json
- 以上两种数据,都可以在请求发起后,进入浏览器network查看请求头中的content-type进行查看
假设我们现在要上传一个数据:
let data = { id:12 }
那么我们可以直接将其传入:
axios.post('/post',data).then((res)=>{ console.log(res) }) 复制代码
axios()方法型
axios({ method:'post', url:'/post', data:data }).then(...) 复制代码
两种数据的小细节
当我们上传的是一个一般的let data = { id:12 }
数据时,Network的请求头里会显示为:application/json;charset=UTF-8
当我们上传的是:
let data = {id:12} let formData = new FormData() for(let key in data){ formData.append(key,data[key]) } 复制代码
这里将data转格式了,格式变为formdata形式。
那么Network的请求头里会显示为:multipart/form-data; boundary=----WebKitFormBoundarywWFnSlPye1ZF8CSw
put方法和patch方法
形式与post方法大体相同,Network显示仅Request Method不同。
delete方法
写法
url删除法
//直接从url里面删除 axios.delete('/data.json',{ params:{ id:12 } }).then((res)=>{ console.log(res) }) 复制代码
从url删除,Network请求头最后面会显示为:Query String Parameters
请求体删除法
axios.delete('/data.json',{ data:{ id:12 } }).then((res)=>{ console.log(res) }) 复制代码
从请求体里删除,Network请求头最后面会显示为:Request Payload
两种方法的删除方式是不同的,具体使用需要和后端沟通。
并发请求
简介
同时进行多个请求,并统一处理返回值。
案例:假设有一个聊天工具,同时有你的聊天记录和个人信息。此时需要调用两个接口去请求数据。此时需要统一处理他们的返回值。
axios提供的方法:all、spread
axios.all方法接受一个数组作为参数,数组中的每个元素都是一个请求,返回一个promise对象,当数组中所有请求均已完成时,执行then方法。 在then方法中执行了 axios.spread 方法。该方法是接收一个函数作为参数,返回一个新的函数。接收的参数函数的参数是axios.all方法中每个请求返回的响应。
function getUserAccount() { return axios.get('/user/12345'); } function getUserPermissions() { return axios.get('/user/12345/permissions'); } axios.all([getUserAccount(), getUserPermissions()]) .then(axios.spread((acct, perms) => { // 两个请求都完成后,acct是getUserAccount的返回值,同理,perms是 getUserPermissions的返回值 })); 复制代码
axios实例简介
为什么要用实例?
当我们需要用到不同的后端域名,直接调用axios.get
并不太方便。我们可以用创建实例的方式去调用,不同的域名用不同的实例一一对应。
表现形式
created() { let instance = axios.create({ baseURL:'http://localhost:8080',//基本请求路径 timeout:1000,//超时设定 }) instance.get('/data.json').then(res=>{ console.log(res) }) } 复制代码
基本配置方法
baseURL:'http://localhost:8080',//请求的域名、基本地址 timeout:1000,//请求超时时长(ms) url:'/data.json',//请求路径 method:'get,post,put,patch,delete',//请求方法 headers:{ token:''//代表当前登陆人的身份信息 },//设置请求头 params:{},//将请求参数拼接在url上,是一个对象 data:{}//将请求参数放在请求体里,是一个对象 复制代码
其中,params和data表现形式为对象。
使用场景通常是发起请求时,顺带传送参数:
//以get请求为例,get有两个配置,分别是相对路径和config axios.get('/data.json',{ params:{ //参数 } }) 复制代码
参数配置方法
1.全局配置
axios.defaults.基本配置方法(baseurl等) 如: axios.defaults.timeout = 1000 //全局配置请求时长1s 复制代码
2.实例配置
let instance = axios.create( //基本配置方法 ) 复制代码
如果设置了全局的配置方法,而实例配置中没有设置相应的方法,则延用全局的方法,否则,以实例中的方法为主。
3.axios请求配置
视具体情况而定,如调用某个路径的文件巨大,我们可以单独对其请求时长进行设置:
instance.get('/data.json',{ timeout:5000 }) 复制代码
总结
优先级:请求配置 > 实例配置 > 全局配置
拦截器
在发起请求前做一些处理,再发起请求后再做一些处理。
分为请求拦截器和响应拦截器
请求拦截器
axios.interceptors.request.use( config=>{ //在发送请求前做些什么 return config }, err=>{ // 在请求错误的时候做些什么(此处错误,请求没有到后端) return Promise.reject(err)//这里返回一个promise对象 } ) 复制代码
响应拦截器
axios.interceptors.responce.use( res=>{ //请求成功对响应数据进行处理 return res },err=>{ //响应错误做些什么(此处错误,到达后端后返回) return Promise.reject(err) } ) 复制代码
两者都在响应错误后进行了promise对象的返回,具体的作用是什么呢?
axios.get().then().catch(err=>{}) 复制代码
这一段代码是我们平时发送get请求时的标准形态,then会执行请求成功后的操作,catch用来捕获错误。
我们前面拦截响应后,无论是请求还是响应的拦截器,他们的err返回的promise都会进入catch中。
取消拦截器(了解即可)
let inerceptors = axios.interceptors.request.use (config=>{ config.header = { auth:true } return config }) axios.inerceptors.request.eject(interceptors) //用axios全局去调用interceptors,这样就取消拦截了。。。 复制代码
举个栗子
通过拦截器控制登陆状态
// 登陆状态,有token let request = axios.create({}) request.interceptors.request.use (config => { config.headers.token = '' return config }) // 非登陆状态,无token let request2 = axios.create({}) 复制代码
有token的可以访问更多,get更多的数据,无token则不行。类似于评论需要登陆
错误处理
表现形式
//首先设置拦截器 axios.interceptors.request.use( config =>{ return config },err =>{ return Promise.reject(err) } ) axios.interceptors.response.use( res =>{ return res },err =>{ return Promise.reject(err) } ) //错误的获取 axios.get('/data.json').then(res=>{ console.log(res) }).catch(err =>{ console.log(err) //所有错误处理都会进入此处 }) 复制代码
具体的实践过程中,我们需要创建一个统一的错误处理,将所有的错误类型都放在拦截其中,方便我们后面调用接口时使用。
栗子
//创建一个请求实例 let instance = axios.create({}) //为请求实例添加请求拦截器 instance.interceptors.request.use( config =>{ return config },err =>{ //请求错误 一般http状态码以4开头,常见:401超时,404 not found 多为前端浏览器错误 return Promise.reject(err) } ) instance.interceptors.response.use( res=>{ return res },err =>{ //响应错误,一般http状态码以5开头,500系统错误,502系统重启等,偏向于服务端返回的报错 return Promise.reject(err) } ) //使用 instance.get('data').then(res=>{ console.log(res) }).catch(err =>{ console.log(err) }) 复制代码
取消请求
用于取消正在进行的http请求,比较少用到,就不做介绍了
最后
如果你觉得此文对你有一丁点帮助,点个赞。或者可以加入我的开发交流群:1025263163相互学习,我们会有专业的技术答疑解惑
如果你觉得这篇文章对你有点用的话,麻烦请给我们的开源项目点点star:http://github.crmeb.net/u/defu不胜感激 !

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
RoP重磅发布0.2.0版本: 架构全新升级,消息准确性达100%
作者简介: 冉小龙-腾讯云中间件团队研发工程师 Apache Pulsar committer RoP 作者及 Maintainer Apache BookKeeper contributor Apache Pulsar Go client 作者 Apache Pulsar Go Functions作者 StreamNative/pulsarctl 作者 摘要 日前,腾讯云中间件团队联合StreamNative社区正式发布了RoP 0.2.0版本,该版本在架构上全新升级,用户在使用中可以完全避免消息丢失、消息重复消费、只能消费一部分 Partition 的数据等问题。 RoP的定义 与 KoP、MoP 和 AoP 相似,RoP 是一种可插拔的协议处理插件。 将 RoP 协议处理插件添加到现有 Pulsar 集群后,用户无需修改代码,便能将现有的 RocketMQ 应用程序和服务迁移到 Pulsar,同时还能使用 Pulsar 的强大功能,例如: 计算与存储分离 多租户 跨地域复制 分层分片 轻量化计算框架 -- Pulsar Functions ... RoP 0.2.0发布 2021...
- 下一篇
如何在 ShardingSphere 中开发自己的 DistSQL
在 《DistSQL:像数据库一样使用 Apache ShardingSphere》 和 《SCTL 涅槃重生:投入 RAL 的怀抱》 中,已经为大家介绍了 DistSQL 的设计初衷和语法体系,并通过实战操作展示了 DistSQL 创建分布式数据库表的强大能力,展现了 Apache ShardingSphere 在新形态下的交互体验。 为了让大家对 DistSQL 有更深入的了解,同时能根据需要定制自己的 DistSQL 语法,本篇将为大家解析 DistSQL 的设计开发流程,同时通过实际的场景案例,带领大家实现一个全新的 DistSQL 语法,完成从需求到设计、开发和测试的完整过程。 兰城翔 SphereEx 中间件研发工程师,Apache ShardingSphere contributor,目前专注于 DistSQL 的设计和研发。 何为 DistSQL DistSQL(Distributed SQL)是 Apache ShardingSphere 特有的操作语言,它与标准 SQL 的使用方式完全一致,用于提供增量功能的 SQL 级别操作能力,以此达到对资源和规则的管理的目的。...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主