axios的介绍及使用
特点:支持promise API 、 拦截请求和响应、转换请求数据和响应数据、取消请求、自动转换JSON数据、客户端支持防御XSRF等;
axios请求方法(需后端定义):get获取数据、 post提交数据(用于表单提交和文件上传)、 patch更新(只将修改的数据推送到后端)、 put更新(所有数据都推送到后端)、 delete删除数据
例如:axios_test.vue:
<script>
export default{
name:'axios_test',
components:{},
created(){
//get
axios.get('/data.json',{params:{id:12,name:'zs'}}).then((res)=>{
console.log(res);
})
或:axios({
method:'get',
url:'/data.json',
params:{
id:12,
name:'zs'
}
}).then((res)=>{
console.log(res);
})
//post
axios.post('/xxx').then({
// 默认application/json常用,用于没有上传文件时,用法同上不详写了
// form-data 表单提交(用于文件上传)
let data = { id:12}
let formData = new FormData()
for(let key in data){
formData.append(key,data[key]);
}
axios.post('post',formData).then(res=>{
console.log(res)
})
})
//put/patch
axios.put('/put',data).then(res=>{
console.log(res);
})
//delete
axios.delete('/delete',{ params:{id:12}}).then(res=>{}) //实则底层调用get请求,params数据将添加到url中去;
axios.delete('/delete',{ data:{id:12}}).then(res=>{}) //实则底层调用post请求,data数据将放在请求体中;
//并发请求:同时进行多个请求,并统一处理返回值。 axios.all()和axios.spread()
axios.all([
axios.get('/data.json'),
axios.get('/city.json')
]).then(
axios.spread((dataRes,cityRes)=>{
console.log(dataRes,cityRes);
})
) //创建axios实例
let instance = axios.create({ //设置后会覆盖以前的设置
baseURL:'http://localhost:8080',
timeout:1000,
url:'/data.json',
method:'get/post/put/patch/delete',
headers:{token:''}, //设置请求头
params:{}, //请求参数拼接到url上
data:{} //请求参数放到请求体中
})
let instance2 = axios.create()
instance.get('/data.json').then(res=>{})
//1、axios全局配置
axios.defaults.timeout = 1000;
axios.defaults.baseURL = 'http://localhost:8080'
//2、axios实例配置(常用方式)
let instance = axios.create() //单独创建防止全局污染
instance.defaults.timeout=3000 //单独设置防止覆盖其他设置
//3、axios请求配置 (三种方式中优先级最高)
instance.get('/data.json',{
time:5000
}) //拦截器:在请求或响应被处理前拦截它们,分为请求拦截器和响应拦截器
//请求拦截器
axios.interceptors.request.use(config=>{
//在发送请求前做些什么
return config
},err=>{
//在请求发生错误时怎么处理
return Promise.reject(err)
})
//响应拦截器
axios.interceptors.response.use(config=>{
//请求成功对响应数据做处理
return res
},err=>{
//在响应发生错误时怎么处理
return Promise.reject(err)
})
//取消拦截器(了解)
let interceptor = axios.interceptors.request.use(config=>{
config.headers={ auto:true}
return config
})
axios.interceptors.request.eject(interceptor);
//拦截器例子1:比如微博评论时需要先登录
let instance = axios.create({})
instance.interceptors.request.use(config=>{
config.headers.token = '';
return config
})
//拦截器例子2:移动端开发时的请求等待
let instance_phone = axios.create({})
instance_phone.interceptors.request.use(config=>{
$('#modal').show() // 请求等待弹窗
return config
})
instance_phone.interceptors.response.use(res=>{
$('#modal').hide() // 请求等待弹窗隐藏
return res
})
//错误处理 实际开发中,一般添加统一错误处理,特殊的单独添加。
//添加请求错误处理拦截器
let instance = axios.create({})
instance.interceptors.request(config=>{
return config
},err=>{
//请求错误 一般http状态码以4开头,常见:401超时,404 没找到
$('#modal').show()
setTimeout(()=>{
$('#modal').hide()
},2000)
return Promise.reject(err)
})
//添加响应错误处理拦截器
instance.interceptors.response(res=>{
return res
},err=>{
//响应错误 一般http状态码以5开头,常见:500系统错误,502系统重启
$('#modal').show()
setTimeout(()=>{
$('#modal').hide()
},2000)
return Promise.reject(err)
})
//添加特殊错误处理
instance.get('/data.json').then(res=>{
console.log(res)
}).catch(err=>{
console.log(err)
})
//取消请求(了解)
let source = axios.CancelToken.source()
axios.get('data.json',{cancelToken:source.token}).then()
source.cancel('cancel http') //取消请求(message可选)
比如当用户查询数据耗时太久,用户不再查询进行了其他操作时可能用到,一般用不到。 }
}
</script>
axios实战:移动端UI的vant使用和axios的封装:
①npm i vant
②npm i ts-import-plugin -D
③按照 API文档的快速上手提示,在 babel.config.js 中配置
module.exports = {
plugins: [
['import', {
libraryName: 'vant',
libraryDirectory: 'es',
style: true
}, 'vant']
]
};
④ 引入 Vant 组件
test.vue:
<template>
<van-button type="default">默认按钮</van-button>
</template>
<script>
import axios from 'axios'
import {Button} from 'vant'
export default {
name:'showlist',
components:{
[Button.name]=Button //局部注册,template模板中没有引用时可不写,vant官方格式。
},
created(){
axios.get(./data.json).then((res)=>{
console.log(res)
})
}
}
</script>
⑤ router.js中添加一条路由:{path:'/showlist',name:'',component:()=>import('./views/showlist.vue')}
⑥ npm run serve 启动服务测试
axios的封装 示例
①contactApi.js:
const CONTACT_API = {
//获取联系人列表
getContactList:{
method:'get',
url:'/contactList'
},
//新建联系人 form-data
newContactForm:{
method:'post',
url:'/contact/new/form-data'
},
//新建联系人 application/json
newContactJson:{
method:'post',
url:'/contact/new/json'
},
//编辑联系人
editContact:{
method:'put',
url:'/contact/edit'
},
//删除联系人
delContact:{
method:'delete',
url:'/contact'
},
}
export default CONTACT_API
②http.js:
import axios from 'axios'
import service from './contactApi.js'
import {Toast} from 'vant'
//service循环遍历,输出不同的请求方法
let instance = axios.create({
baseURL:'http://localhost:9000/api',
timeout:1000
})
const Http = {}; //存放请求方法的容器
for(let key in service){
let api = service[key]; //url、method
Http[key] = async function(
params, //请求参数
isFormData = false, //标识是否是form-data请求
config={} //配置参数
){
let newParams = {}
if(params && isFormData){
newParams = new FormData()
for(let i in params){
newParams.append(i,params([i]))
}
}else{
newParams = params
}
//不同请求的判断
let response = {}; //请求的返回值
if(api.method ==='put'|| api.method ==='post'||api.method==='patch'){
try{ response = await instance[api.method](api.url,newParams,config)
}catch(err){
response = err
}
}else if(api.method ==='delete'||api.method==='get'){
config.params = newParams
try{
response = await instance
[api.method](api.url,config)
}catch(err){
response = err
}
}
return response;
}
}
//拦截器的添加
instance.interceptors.request.use(config=>{
Toast.loading({
mask:false, //是否有阴影
duration:0, //一直存在
forbidClick:true, //禁止点击
message:'加载中...'
})
return config
},err=>{
Toast.clear()
Toast('请求错误,请稍后重试')
})
//响应拦截器
instance.interceptors.response.use(res=>{
Toast.clear()
return res.data
},()=>{
Toast.clear()
Toast('请求错误,请稍后重试')
})
export default Http
③main.js文件中引入http.js,并将其挂载到vue实例上,引入后添加如下:
Vue.prototype.$http = Http;
④vue组件中使用:
<script>
import axios from 'axios'
import {Button} from 'vant'
export default {
name:'showlist',
components:{
[Button.name]=Button //局部注册,template模板中没有引用时可不写。
},
methods:{
//获取联系人列表
async getList(){
let res = await this.$http.getContact()
this.list = res.data
}
}
}
</script>
axios的介绍及使用的更多相关文章
- axios基础介绍
axios基础介绍 get请求要在params中定义,post要在data中定义.
- 学习axios必知必会(1)~axios基本介绍、axios配置、json-server接口模拟工具
一.axios基本介绍 1.axios(前端最流行的 ajax 请求库) 特点: ① 基于 xhr + promise 的异步 ajax 请求库 ② 浏览器端/node 端都可以使用 ③ 支持请求/响 ...
- 3-2 axios基础介绍
1.静态引用 <script src="https://unpkg.com/axios/dist/axios.min.js"></script> 2.npm ...
- axios简单介绍
axios的配置,get,post,axiso的同步问题解决 一.缘由 vue-resoure不更新维护,vue团队建议使用axios. 二.axios安装 1.利用npm安装npm install ...
- axios Api介绍
1.Performing a GET request axios.get('/user?ID=12345') .then(function (response) { // handle success ...
- Vuex与axios介绍
Vuex集中式状态管理里架构 axios (Ajax) Vuex集中式状态管理架构 -简单介绍: vuex是一个专门为Vue.js设计的集中式状态管理架构. 我们把它理解为在data中需要共享给其他组 ...
- 介绍axios和promise
今天小编为大家带来 axios 和promise的详细讲解,包含 axios的使用方法 多种写法,封装 以及 promise的详细讲解,项目中如何运用等,会一一的为大家讲解清楚. 一.axios的介绍 ...
- 4.npm模块安装和使用(axios异步请求,lodash工具库)
建立package.json npm init 下载包 npm install axios npm install lodash 下载包,并加到package里面 npm install axios ...
- 使用axios实现上传视频进度条
这是最终的效果图 先介绍一下axios的使用:中文的axios官方介绍 首先定义一个uploadTest方法,写在vue文件的methods里 该方法有三个参数,分别是参数,和两个回调函数,参数就是我 ...
随机推荐
- Oracle分区表之分区范围扫描(PARTITION RANGE ITERATOR)与位图范围扫描(BITMAP INDEX RANGE SCAN)
一.前言: 一开始分区表和位图索引怎么会挂钩呢?可能现实就是这么的不期而遇:比如说一张表的字段是年月日—‘yyyy-mm-dd’,重复率高吧,适合建位图索引吧,而且这张表数据量也不小,也适合转换成分区 ...
- 使用Nuget重新安装packages.config中的组件的方法
Update-Package -ProjectName 'Ko.app.web' -Reinstall 该语句作用:按照packages.config中给出的程序组件,重新下载安装一遍.
- vue+Mint-ui实现登录注册
创建一个组件:注册组件 (register/index.vue.script.js.style.scss,register/header) 注册路由 router/index.js { path: ' ...
- Input标签文件上传,使用详解
1.html添加标签按钮 <button ion-button (click)="selectVideo()">添加</button> <input ...
- 第一章 Xshell5评估期已过问题
您的Xshell评估期已过.请访问我们的在线商店购买Xshe许可证.产品密钥将通过电子邮件发送给您. 解决方法 一.进入下载网站 https://www.netsarang.com/zh/thank- ...
- 【JS学习】慕课网2-7 练习题:制作新按钮,“新窗口打开网站” ,点击打开新窗口。
要求: 1.新窗口打开时弹出确认框,是否打开 提示: 使用 if 判断确认框是否点击了确定,如点击弹出输入对话框,否则没有任何操作. 2.通过输入对话框,确定打开的网址,默认为 http://www. ...
- 分考场(np完全问题,回溯法)
问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输入格式 第一行,一个整数n(1<n<100),表示参加考试的人 ...
- poj 3294 后缀数组+二分
题目大意: 给定n个字符串,求出现在不小于k个字符串中的最长子串 基本思路: 二分长度,统计个数,一般套路,就是这个跟说好的不一样啊,我非得开2倍才不re,真他妈不爽,先二分找出长度,然后根据长度输出 ...
- ueditor 加载文本
一. 定义一个隐藏区域,然后用js获取 // 定义 文本框 <script id="editor" type="text/plain" style=&qu ...
- zabbix 发送邮件到企业微信
#!/usr/bin/python2.7#_*_coding:utf-8 _*_#auther:拿来用用import requests,sys,jsonimport urllib3urllib3.di ...