Axios
功能强大的网络请求库
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
axios({
methods: '请求的类型',
url: '请求的URL地址',
params: {'URL中的查询参数(get)'},
data: {'请求体参数(post)'}
}).then((result) => {
//.then用来指定请求成功之后的回调函数
//形参中的result是请求成功之后的结果
})
axios函数的返回值是一个Promise对象,通过请求返回的数据是经过axios处理过的
axios在数据外套了一层壳,返回的结果.data才是真正请求回来的数据
async与awit
;(async()=>{
const {data: res} = await axios({
method:'post',
url:'请求地址',
data:{
'请求数据'
}
})
console.log(res);
})()
调用axios后,使用async/await进行简化
再使用解构赋值将axios封装的大对象中,把data属性结构出来在进行重命名
axios的get与post
get
axios.get('url地址', {
// get参数
params: {},
// 设置请求头
headers: {}
})
.then(function(response){},function(err){})
//get请求的数据也可以写在请求地址中
axios.get(url地址?key=value&key2=value2)
.then(function(response){},function(err){})
post
axios.post('url地址', {/*post参数*/})
.then(function(response){},function(err){})
axios的拦截器
通过对请求和响应进行拦截 对数据进行二次处理
import axios from 'axios'
const api = axios.create({
baseURL:'https://cnodejs.org/api/v1'
})
// 请求拦截
api.interceptors.request.use( // 接受两个回调函数作为参数
config => { // 第一个函数用于对请求配置进行修改
// 配置业务逻辑 当用户有token时 发送请求在请求头自动携带token
const token = window.sessionStorage.token
if(token) config.headers.authorzation = token
return config
},
err => { // 错误处理
return Promise.reject(err)
}
)
// 响应拦截
api.interceptors.response.use(response => {
// 业务逻辑 当响应状态码为401时 跳转到登录页
if(response.status === 401) return window.location.href = '/login'
})
export default api
Vue 2.x将axios挂载为全局属性
因为vue组件中只要请求数据就需要使用axios,import引入代码重复
通过把axios挂载在Vue构造函数的原型上实现引入代码简化
//在main.js中
import axios from 'axios'
//Vue.prototype.axios = axios
Vue.prototype.$http = axios //便于进行区分及维护
挂载后在所有组件中都可以通过this.axios使用axios
一般Vue的内置属性方法都以$开头
所以便于区分一般将axios命名为$http
由于挂载在Vue构造函数的原型上所以在实例中通过this即可访问
基础路径
由于一般请求路径都为重复的地址,多次请求时代码重复且后期维护困难
通过设置默认根路径简化请求地址
//在main.js中
import axios from 'axios'
//全局配置axios的请求根路径
axios.defaults.baseURL = 'http://www.baidu.com'
Vue.prototype.$http = axios
设置默认请求根路径后,axios的请求就可以省略前面的路径
axios的二次封装
通过挂载全局只能设置一个baseURL,当需要访问多个根路径请求接口时没有复用价值
通过axios.create()方法将axios分成多个小axios,分别设置来实现代码复用
在utils文件夹中定义对应的请求文件
import axios from 'axios'
const axios1 = axios.create({
baseURL: 'http://api.taobao.com'
})
export default axios1
import axios from 'axios'
const axios2 = axios.create({
baseURL: 'http://api.jd.com'
})
export default axios2
此时的axios1与axios2不存在关系,分别设置不同的baseURL
当需要发起对应的接口api请求时,引入对应的axios即可
请求代码复用
当发起axios请求时的函数代码也一样时,可以封装为对应的api
引入对应的请求axios,如axios1,处理业务逻辑并return,由于return的为一个axios的Promise
在对应引入的组件await并解构即可
import axios from 'axios';
import { Message } from 'element-ui';
class Http {
constructor() {
this.axiosInstance = axios.create({timeout: 30000});
this.axiosInstance.defaults.headers.post['Content-Type'] = 'application/json;charset=utf-8';
}
// 状态不为200时的错误提示
requestErrorFn(err) {
if(err.request.status != 200) {
Message.error(`请求出错,错误代码: ${err.request.status},请联系后台管理人员。`);
}
}
// 状态为200时的成功操作
requestSuccessFn(res) {
// code为0代表成功
if(!res) return;
if(!res.data) return;
if(res.data.code == 0){
return res.data;
} else{
if(res.data) {
Message.error(res.data.msg);
}
}
}
async get(url, params) {
const res = await this.axiosInstance.get(url, {
params: params
}).catch(this.requestErrorFn);
return this.requestSuccessFn(res);
}
/**
* axios post请求
* @param url=服务器地址
* @param params=请求参数
* @param encode = (如需要传送application/x-www-form-urlencoded格式参数,使用qs.stringify转换) 如果参数是数组的形式,传参数的时候先JSON.stringify()转化数组,再传过来
* @param config :object axios得配置
* @returns {Promise<*>}
*/
async post(url, data, config={}) {
const res = await this.axiosInstance.post(url, data, config).catch(this.requestErrorFn);
return this.requestSuccessFn(res);
}
async put(url, data) {
const res = await this.axiosInstance.put(url, data).catch(this.requestErrorFn);
return this.requestSuccessFn(res);
}
async delete(url, data) {
const res = await this.axiosInstance.delete(url, data).catch(this.requestErrorFn);
return this.requestSuccessFn(res);
}
}
export default new Http();
Vue 3.x将axios挂载为全局属性
在实例中通过this即可访问
import { createApp } from 'vue'
import App from './App.vue'
import Axios from 'axios'
// 原代码
// createApp(App).mount('#app')
// 修改后的代码
const app = createApp(App)
app.config.globalProperties.Axios = Axios
app.mount('#app')
fetch
axios不支持jsonp请求 如果需要用jsonp请求可以使用fetch-jsonp
import fetchJsonp from 'fetch-jsonp'
fetchJsonp('/users.jsonp', {
jsonpCallback: 'cb', // 回调函数名称
})
.then((response) => {
return response.json()
}).then((json) => {
console.log('parsed json', json)
}).catch((ex) => {
console.log('parsing failed', ex)
})