axios
Axios 是什么
Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js
Axios 使用简单,包尺寸小且提供了易于扩展的接口。
https://www.axios-http.cn/
—
后端api需要自行下载程序,运行,我使用的flask写的api接口。
https://www.123pan.com/s/ESeA-kufeh.html
使用axios直接使用url发送请求
后端需配置可跨域,前端无需设置跨域
使用axios发送无参数get请求
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios({
url: "http://127.0.0.1:5000/keynav/on_categorys/19",
method: "get",
}).then(res => {
console.log(res);
})
export default {}
</script>
上面的代码,完成之后,打开f12,然后查看控制台即可看到结果
使用axios发送有参数get请求
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios({
url: "http://127.0.0.1:5000/keynav/on_categorys",
method: "get",
params: {
id: "1"
}
}).then(res => {
console.log(res);
})
export default {}
</script>
使用axios发送无参数post请求
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios({
url: "http://127.0.0.1:5000/keynav/on_categorys/19",
method: "post",
}).then(res => {
console.log(res);
})
export default {}
</script>
使用axios发送有参数post请求
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios({
url: "http://127.0.0.1:5000/keynav/on_categorys",
method: "post",
params: {
id: "1"
}
}).then(res => {
console.log(res);
})
export default {}
</script>
使用axios处理并发请求
并发请求(返回结果是数组)
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios.all([
axios.get("http://127.0.0.1:5000/keynav/category"),
axios.get("http://127.0.0.1:5000/keynav/on_categorys", { params: { id: 19 } }),
]).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
export default {}
</script>
使用spread方法处理响应数组结果(把数组的每一个元素变成一个对象)
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios.all([
axios.get("http://127.0.0.1:5000/keynav/category"),
axios.get("http://127.0.0.1:5000/keynav/on_categorys", { params: { id: 19 } }),
]).then(
axios.spread((res1, res2) => {
console.log(res1);
console.log(res2);
})
).catch(err => {
console.log(err);
})
export default {}
</script>
全局配置
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios.defaults.baseURL = 'http://127.0.0.1:5000/keynav'
axios.defaults.timeout = 5000;
axios.get("/on_categorys", { params: { id: 19 } }).then(res => {
console.log(res);
});
axios.post("/category").then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
export default {}
</script>
请求配置
这些是创建请求时可以用的配置选项。只有 url
是必需的。如果没有指定 method
,请求将默认使用 GET
方法。
{
url: '/user',
method: 'get',
baseURL: 'https://some-domain.com/api/',
transformRequest: [function (data, headers) {
return data;
}],
transformResponse: [function (data) {
return data;
}],
headers: {'X-Requested-With': 'XMLHttpRequest'},
params: {
ID: 12345
},
paramsSerializer: function (params) {
return Qs.stringify(params, {arrayFormat: 'brackets'})
},
data: {
firstName: 'Fred'
},
data: 'Country=Brasil&City=Belo Horizonte',
timeout: 1000,
withCredentials: false,
adapter: function (config) {
},
auth: {
username: 'janedoe',
password: 's00pers3cret'
},
responseType: 'json',
responseEncoding: 'utf8',
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
onUploadProgress: function (progressEvent) {
},
onDownloadProgress: function (progressEvent) {
},
maxContentLength: 2000,
maxBodyLength: 2000,
validateStatus: function (status) {
return status >= 200 && status < 300;
},
maxRedirects: 5,
socketPath: null,
httpAgent: new http.Agent({ keepAlive: true }),
httpsAgent: new https.Agent({ keepAlive: true }),
proxy: {
protocol: 'https',
host: '127.0.0.1',
port: 9000,
auth: {
username: 'mikeymike',
password: 'rapunz3l'
}
},
cancelToken: new CancelToken(function (cancel) {
}),
decompress: true
}
axios实例
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
let newVar1 = axios.create({
baseURL: "http://127.0.0.1:5000/keynav",
timeout: 5000
}); //创建一个axios实例
newVar1({
url: "/on_categorys",
params: {
id: 19
}
}).then((res) => {
console.log(res);
}).catch((res) => {
console.log(res);
});
let newVar2 = axios.create({
baseURL: "http://127.0.0.1:5000/keynav",
timeout: 5000
}); //创建一个axios实例
newVar2({
url: "/category"
}).then((res) => {
console.log(res);
}).catch((res) => {
console.log(res);
});
export default {}
</script>
axios拦截器
axios给我们提供了两大类拦截器一种是请求方向的拦截(成功请求,失败的) 另一种是响应方向的(成功的,失败的)
拦载器的作用,用于我们在网络请求的时候在发起请求或者响应时对操作进行可响应的外理 发起请求时可以添加网页加载的动画强制登录 可应的时候口以进行相应的数据外理
请求方向的
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios.interceptors.request.use(config => {
console.log("进入请求拦截器");
console.log(config);
return config;
}, err => {
console.log("请求方向失败");
console.log(err);
});
axios.get("http://127.0.0.1:5000/keynav/on_categorys?id=19").then(res => {
console.log(res);
})
export default {}
</script>
响应方向的
<template>
<div>
111
</div>
</template>
<script>
import axios from 'axios'
axios.interceptors.response.use(config => {
console.log("进入响应拦截器");
return config; //放行请求,若没有return这个语句,则不会执行语句外下面的axios.get()
// return config.data;
}, err => {
console.log("响应方向失败");
console.log(err);
});
axios.get("http://127.0.0.1:5000/keynav/on_categorys?id=19").then(res => {
console.log(res);
})
export default {}
</script>
axios在vue中的模块封装
方式一:封装者处理,调用者请求
创建一个与网络请求相关的部分
创建一个文件夹network,里面创建一个用来存放请求的文件夹request,里面创建一个axios的请求函数文件request.js,里面内容需要先导入axios模块,然后把函数暴露出去:
封装者:src/network/request/request.js
//封装者位置
import axios from 'axios'
export function request(config) {
axios({
url: config
}).then(res => {
console.log(res);
})
}
然后在main.js中引入封装好的请求文件
调用者位置:src/main.js
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.axios = axios;
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
}).$mount('#app');
//引入封装好的请求文件
//调用者位置
import { request } from './network/request/request'
request("http://127.0.0.1:5000/keynav/on_categorys?id=19")
参数补全版
//封装者位置
import axios from 'axios'
export function request(config, success, fail) { //参数:请求结果、成功、失败
axios({
url: config
}).then(res => {
success(res);
}).catch(err => {
fail(err);
})
}
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.axios = axios;
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
}).$mount('#app');
//引入封装好的请求文件
//调用者位置
import { request } from './network/request/request'
request("http://127.0.0.1:5000/keynav/on_categorys?id=19", res => {
console.log(res);
}), err => {
console.log(err);
}
方式二:封装者请求,调用者处理
在模块里进行请求,把请求的信息交给调用者去处理
//封装者位置
import axios from 'axios'
export function request(config) { //参数:请求结果
axios.defaults.baseURL = "http://127.0.0.1:5000/keynav";
axios(config.url, { params: config.params }).then(res => {
config.success(res);
}).catch(err => {
config.fail(err);
})
}
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.axios = axios;
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
}).$mount('#app');
//引入封装好的请求文件
//调用者位置
import { request } from './network/request/request'
request({
url: '/on_categorys',
params: {
id: 19
},
success: res => {
console.log(res);
},
fail: err => {
console.log(err);
}
})
方式三:封装者返回对象,调用者处理(推荐使用)
封装者返回Promise对象,调用者使用then和catch方法处理响应结果或错误信息。
//封装者位置
import axios from 'axios'
export function request(config) { //参数:请求结果
return new Promise((resolve, reject) => {
let newVar = axios.create({
baseURL: "http://127.0.0.1:5000/keynav",
timeout: 5000
});
newVar(config).then(res => {
resolve(res);
}).catch(err => {
reject(err);
})
})
}
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.axios = axios;
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
}).$mount('#app');
//引入封装好的请求文件
//调用者位置
import { request } from './network/request/request'
request({
url: '/on_categorys',
params: {
id: 19
},
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});
方式四:封装者请求创建实例并返回Promise对象,调用者处理(推荐使用)
通过封装者封装的request函数进行请求,使用axios.create方法创建实例,并返回Promise对象(封装者位置中的 return newVar(config);
是返回Promise对象的语句。)
调用者使用Promise的then和catch方法处理响应结果或错误信息。
//封装者位置
import axios from 'axios'
export function request(config) { //参数:请求结果
let newVar = axios.create({
baseURL: "http://127.0.0.1:5000/keynav",
timeout: 5000
});
return newVar(config);
}
import Vue from 'vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue'
import axios from 'axios'
Vue.use(ElementUI);
Vue.prototype.axios = axios;
Vue.config.productionTip = false;
new Vue({
render: h => h(App),
}).$mount('#app');
//引入封装好的请求文件
//调用者位置
import { request } from './network/request/request'
request({
url: '/on_categorys',
params: {
id: 19
},
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
});