Axios及其async await封装
Axios(IE8+)
基于promise的http库
可用于浏览器与node.js
1.特性
- 支持promise API
- 拦截请求和相应
- 转换请求数据和响应数据
- 取消请求
- 自动转换JSON数据
- 客户端支持防御XSRF攻击
2.axios请求方法:get,post,put, patch, delete
1get: 获取数据
2post(新建): 提交数据(表单,文件)
3put(更新): 更新数据(所有数据推送到后端)
4patch(耗性能): 更新数据(只将修改的数据推送到后端)
5delet: 删除数据
3.返回304(重定向)
表示重复的请求,直接返回304,加快请求速度
4.post(Content-Type)
11.form-data 表单提交(文件上传)
22.application/json 常用数据提交
3
4//form-data请求举例
5let formData = new FormData()
6for(let key in data){
7 formData.append(key,data[key])
8}
5.并发请求(同时进行多个请求,并统一处理返回值)
1//axios.all() 用于多个请求并发
2//axios.spread() 用于处理返回值
3
4axios.all(
5 [
6 axios.get('/data.json1'),
7 axios.get('/data.json2')
8 ]
9).then(
10 axios.spread((json1,json2)=>{
11 console.log(json1,json2)
12 })
13)
6.axios实例化
当每请求的设置不尽相同时,可以通过配置实例发起不同设置的请求
1let instance = axios.create({
2 baseURL: 'http://localhost:8080',
3 timeout: 1000,
4})
5instance.get('/data.json').then(res=>{
6 console.log(res)
7})
7.axios配置
- 全局配置
11.axios.defaults.timeout = 2000
22.axios.defaults.baseURL = ''
- 实例配置
1let instance = axios.create({
2 //配置
3 baseURL: 'http://localhost:8080',//请求的域名,基本地址
4 timeout: 1000,//超时取消请求时长(ms),一般后台会有定义
5 url: '/data.json',//请求路径
6 method: 'get',//get,post,put, patch, delete(请求方法)
7 headers: {//设置请求头
8 token: '',//身份信息
9 },
10 params: {},//请求参数拼接在url(get)
11 data: {},//请求参数放在请求体(post)
12})
13instance.defaults.timeout = 3000
- 请求配置
1instance.get('/data.js',{
2 timeout: 5000
3})
- 优先级
请求配置>实例配置>实例配置
8.拦截器
在请求或响应被处理前拦截他们
- 请求拦截器
1axios.interceptors.request.use(
2 config => {
3 //发送请求前
4 return config
5 },
6 err => {//错误处理
7 //请求错误的时候 404 not find,401超时等
8 return Promise.reject(err)
9 }
10)
- 响应拦截器
1axios.interceptors.response.use(
2 res => {
3 //请求成功
4 return res
5 },
6 err => {//错误处理
7 //响应错误的时候 500服务器错误等
8 return Promise.reject(err)
9 }
10)
- 取消拦截器
1axios.interceptors.request.eject(interceptors)
9.取消请求
1let source = axios.CancelToken.source() //创建实例
2axios.get('/data.js',{//开始请求
3 cancelToken: source.token//配置项
4}).then(res => {
5 console.log(res)
6}).catch(err => {
7 console.log(err)
8})
9
10source.cancel('请求取消了')//调用方法取消请求
10.统一封装(async await 方法)
api.js接口信息
1//api.js接口信息
2const api = {
3 api1: {
4 method: 'get',
5 url: '/data1.js
6 },
7 api2: {
8 method: 'post',
9 url: '/data2.js
10 }
11}
12export default api
http.js请求对象
1import axios from 'axios'
2import Api from 'api.js'
3
4let instance = axios.creat({
5 baseURL: 'http://localhost:8080',
6 timeout: 1000
7})
8const Http = {}//包裹请求方法的容器
9
10for(let key in Api){
11 let api = Api[key]
12 Http[key] = async function(
13 params,//请求参数
14 isFormData=false,//是否是form-data请求
15 config={}//配置参数
16 ){
17 let newParams = {}
18
19 //判断content-type是不是form-data类型
20 if(params && isFormData){
21 newParams = new FormData()
22 for(let i in params){
23 newParams.append(i,params[i])
24 }
25 }else newParams = params
26
27 //不同请求的判断
28 let res = {}
29 if(api.method === 'put' || api.method === 'post' || api.method === 'patch'){
30 try{
31 res = await instance[api.method](api.url,newParams,config)
32 }catch(err){
33 res = err
34 }
35 }else if(api.method === 'delete' || api.method === 'get'){
36 config.params = newParams
37 try{
38 res = await instance[api.method](api.url,config)
39 }catch(err){
40 res = err
41 }
42 }
43 return res //返回响应值
44 }
45}
46//请求拦截器
47instance.interceptors.request.use(
48 config => {
49 //发起请求前
50 Toast.loading()
51 return config
52 },
53 err => {
54 //请求错误
55 Toast.clear()
56 return err
57 }
58)
59//响应拦截器
60instance.interceptors.response.use(
61 res => {
62 //响应前
63 Toast.clear()
64 return res.data
65 },
66 err => {
67 //响应错误
68 Toast.clear()
69 return err
70 }
71)
72
73export default Http
调用方法
1import Http from 'http.js'
2Vue.prototype.$Http = Http
3
4async function(){
5 let res = await this.$Http.api1({id: 4})
6}
7
8async function(){
9 let res = await this.$Http.api2(info,true,config)
10}

Axios及其async await封装的更多相关文章
- 使用 async await 封装微信小程序HTTP请求
1. 编写将普通回调函数形式的方法转换为promise方法的promisic方法 // util.js const promisic = function (func) { return functi ...
- 已配置好的vue全家桶项目router,vuex,api,axios,vue-ls,async/await,less下载即使用
github 地址: https://github.com/liangfengbo/vue-cli-project 点击进入 vue-cli-project 已构建配置好的vuejs全家桶项目,统一管 ...
- 使用async await 封装 axios
异步变同步: 厉害-- https://www.jianshu.com/p/4168efdc172b
- vue 中使用 async/await 将 axios 异步请求同步化处理
1. axios 常规用法: export default { name: 'Historys', data() { return { totalData: 0, tableData: [] } }, ...
- Vue实例中封装api接口的思路 在页面中用async,await调用方法请求
一般我们写小型的项目是用不到封装axios实例 但是当我们写大型项目时 接口有时候多到有上百个接口,那我们在请求一次调用一次接口,接口上好多都是重复的,这个时候我们就可以封装axios实例,既节省了 ...
- 在react+redux+axios项目中使用async/await
Async/Await Async/Await是尚未正式公布的ES7标准新特性.简而言之,就是让你以同步方法的思维编写异步代码.对于前端,异步任务代码的编写经历了 callback 到现在流行的 Pr ...
- 在axios中使用async await
最近在做树鱼的项目, 联想到 如果用 async await 怎么处理, export async function Test1() { return new Promise((resolve) =& ...
- vue项目中对axios的二次封装
近来在使用vue重构公司m站时,使用了axios来进行数据的请求,由于项目的需要,对axios进行了二次封装,点击进入axios //引入axios import axios from 'axios' ...
- async/await,了解一下?
上一篇博客我们在现实使用和面试角度讲解了Promise(原文可参考<面向面试题和实际使用谈promise>),但是Promise 的方式虽然解决了 callback hell,但是这种方式 ...
随机推荐
- SpringBoot中常用的45个注解
1.SpringBoot/spring @SpringBootApplication: 包含@Configuration.@EnableAutoConfiguration.@ComponentScan ...
- openEuler网络配置+换源+桌面环境ukui等基本环境部署
镜像下载.域名解析.时间同步请点击阿里云开源镜像站 1.网络配置 你可以选择查看官方文档进行配置:配置网络 (openeuler.org) 接下来的操作基本都需要root权限,所以直接使用root用户 ...
- ansible 一 简介和部署
一.Ansible的介绍 Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点.实现了批量系统配置 ...
- [SPDK/NVMe存储技术分析]012 - 用户态ibv_post_send()源码分析
OFA定义了一组标准的Verbs,并提供了一个标准库libibvers.在用户态实现NVMe over RDMA的Host(i.e. Initiator)和Target, 少不了要跟OFA定义的Ver ...
- IDEA的git的拉去提交Java day9
赶鸭子上架,没法子. 新的知识点24号继续学习,今天认真熟悉了以下IDEA,的git代码的提交和拉去,不过拉去下来的项目有些打开的问题有点多,还在继续解决中-- git知识明天一并上传博客.
- ShardingSphere-Proxy(一)
1.现实中的问题 我们知道数据库的数据,基本80%的业务是查询,20%的业务涵盖了增删改,经过长期的业务变更和积累数据库的数据到达了一定的数量之后,直接影响的是用户与系统的交互,查询时的速度,插入数据 ...
- 论文翻译:2018_Source localization using deep neural networks in a shallow water environment
论文地址:https://asa.scitation.org/doi/abs/10.1121/1.5036725 深度神经网络在浅水环境中的源定位 摘要: 深度神经网络(DNNs)在表征复杂的非线性关 ...
- 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)?
// 使用柯里化 + 递归function curry ( fn ) { var c = (...arg) => (fn.length === arg.length) ? ...
- 手撕代码之线程:thread类简单使用
转载于:https://blog.csdn.net/qq_22494029/article/details/79273127 简单多线程例子: detch()启动线程: 1 #include < ...
- 为什么在重写 equals 方法的时候需要重写 hashCode 方法?
因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类, 如 HashMap.HashSet 都依赖于 hashcode 与 equals 的规定.