Vue官方推荐使用的网络异步请求框架
一、axios框架基本使用
1.1 axios请求方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| axios(config)
axios.request(config)
axios.get(url[, config])
axios.delete(url[, config])
axios.head(url[, config])
axios.post(url[, config])
axios.put(url[, config])
axios.patch(url[, config])
|
1.2 axios框架安装
vue-cli项目运行npm install axios -save
1.3 基本使用
1 2 3 4 5 6 7 8 9 10 11 12 13
| ...
import axios from "axios";
...
axios({ url: "http://123.207.32.32:8000/home/multidata", method: "get" }).then(res => { console.log(res); })
|
1 2 3 4 5 6
| axios.get("http://123.207.32.32:8000/home/multidata", { }).then(res => { console.log(res); })
|
1 2 3 4 5 6 7 8 9 10 11
| axios({ url: "http://123.207.32.32:8000/home/data", method: "get", params: { type: "sell", page: 1 } }).then(res => { console.log(res); })
|
二、axios实现并发请求
之前在学Promise中了解多了并发请求的解决方法,axios也有属于自己的并发请求解决操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| axios.all([ axios({ url: "http://123.207.32.32:8000/home/multidata" }), axios({ url: "http://123.207.32.32:8000/home/data", params: { type: "sell", page: 1 } }) ]).then(res => { console.log(res[0]); console.log(res[1]); })
|
1 2 3 4 5 6
| axios.all([ ... ]).then(axios.spread((res1, res2) => { console.log(res1); console.log(res2); }))
|
三、axios配置
3.1 全局配置
1 2 3 4 5 6 7 8
| axios({ baseURL: "http://123.207.32.32:8000", url: "/home/multidata", method: "get", timeout: 5 }).then(res => { console.log(res); })
|
- 像上面例子,baseURL和timeout参数是非常常用的,可以将这些参数抽取出来,变成全局配置,每个axios请求自带这些参数
1 2 3 4 5 6 7 8 9 10 11
|
axios.defaults.baseURL = "http://123.207.32.32:8000"; axios.defaults.timeout = 5000;
axios({ url: "/home/multidata", method: "get" }).then(res => { console.log(res); })
|
3.2 常见的配置选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| url: "/xx/xx/xx"
method: "get"
baseURL: "http://xxx.com"
transformRequest: [function(data) {}]
transformResponse: [function(data) {}]
headers: {'x-Requested-With':'XMLHttpREquest'}
params: {id: 12}
paramsSerializer: function(params) {}
data: {key: value}
timeout: 1000
withCredentials: false
adapter: function(resolve, reject, config)
//身份验证信息 auth: {username: "", pwd: "123456"}
responseType: "json"
|
四、axios实例
在分布式项目中,不是每个请求都是请求同一个服务器,这样导致而配置了全局默认配置baseURL写死了,不能切换服务器,这时候要考虑创建一个单独的实例,每个实例有自己对应的服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const axiosInstance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
axiosInstance({ url: "/home/multidata", method: "get" }).then(res => { console.log(res); })
axiosInstance({ url: "/home/data", method: "get", params: { type: "cell", page: 1 } }).then(res => { console.log(res); })
|
五、axios模块化封装
在开发中,利用第三方框架时,我们要有意识对框架进行封装,不要每个组件都导入框架,使用框架。这样会导致对此框架的依赖十分严重,一旦此框架不再维护或者出现巨大bug时候,会导致每一个组件都要进行修改,十分蛋疼,所有要对框架进行封装解决,避免出现此问题
5.1 封装方式一
- 新建一个文件夹network,存放axios相关的js文件。新建一个request.js文件,里面存放主要的请求代码
- 传递三个参数,利用回调函数的方式来执行请求后的相关代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import axios from "axios";
export function request(config, success, failure) { const instance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
instance(config).then(res => { success(res); }).catch(err => { failure(err); }) }
|
1 2 3 4 5 6 7 8 9 10
| import {request} from "./network/request"; request({ url: "/home/multidata", method: "get" },res => { console.log(res); }, err => { console.log(err); });
|
5.2 封装方式二
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| import axios from "axios";
export function request2(config) { const instance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
instance(config.baseConfig).then(res => { config.success(res); }).catch(err => { config.failure(err); }) }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| import {request2} from "./network/request"; request2({ baseConfig: { url: "/home/multidata", method: "get" }, success(res) { console.log(res); }, failure(err) { console.log(err); } })
|
5.3 封装方式三
- 封装成一个promise对象进行返回,使用方法变得和axios原生方式相似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import axios from "axios";
export function request3(config) { return new Promise((resolve, reject) => { const instance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
instance(config).then(res => { resolve(res); }).catch(err => { reject(err); }) }) }
|
1 2 3 4 5 6 7 8 9 10
| import {request3} from "./network/request"; request3({ url: "/home/multidata", method: "get" }).then(res => { console.log(res); }).catch(err => { console.log(err); })
|
5.4 封装方式四(推荐)
- 由于axios的实例对象本身就是一个Promise对象,所以没有必要封装到一个Promise对象中进行返回,直接返回一个axios实例对象
- 使用方法和方式三一样
1 2 3 4 5 6 7 8 9 10 11
| import axios from "axios";
export function request4(config) { const instance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
return instance(config) }
|
六、拦截器
6.1 请求拦截
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const instance = axios.create({ baseURL: "http://123.207.32.32:8000", timeout: 5000 });
instance.interceptors.request.use(config => { console.log("请求拦截成功!"); return config; }, err => { console.log("请求拦截失败!") });
|
6.2 响应拦截
1 2 3 4 5 6 7
| instance.interceptors.response.use(res => { console.log("响应拦截成功!"); return res; }, err => { console.log("响应拦截失败!"); });
|