Axios 是一个基于 promise 的 HTTP 库。将axios封装好后能更高效的开发并且方便维护,而且在以后的项目中也能直接套用,所以封装好是必要的。在参考了很多方法后,我拼凑出了一套我认为很实用的方法。
这个是功能性文件是拼接url和参数的,读一遍知道他有什么功能就行了
const helper = {
// 根据name获取地址栏的参数值
getQueryString (name) {
let reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`)
let hash = window.location.hash
let search = hash.split('?')
let r = search[1] && search[1].match(reg)
if (r != null) return r[2]; return ''
},
// 拼接参数至url
queryString (url, query) {
let str = []
for (let key in query) {
str.push(key + '=' + query[key])
}
let paramStr = str.join('&')
return paramStr ? `${url}?${paramStr}` : url
}
}
export default helper
接收前端发来的请求,处理后发往后端
import axios from 'axios'
import helper from './helper'
let qs = require('querystring')
//console.log( process.env.NODE_ENV)
//判断环境提供baseURL,注意要与后台地址一致
let root = process.env.NODE_ENV === 'development'
// 开发环境api接口
?
`http://localhost:3001/api`
// 生产环境api接口
:
`http://127.0.0.1:3001/api`;
// 引用axios,设置头文件
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
function apiAxios(method, url, params, token) {
return axios({
method: method,
//拼接参数
url: method === 'GET'|| method === 'DELETE' ? helper.queryString(url,params) : url,
data: method === 'POST' || method === 'PUT' ? qs.stringify(params) : null,
baseURL: root,
timeout: 10000,
headers: { Authorization: `Bearer ${token}` },
withCredentials: false
})
}
export default {
get: function (url, params, token) {
return apiAxios('GET', url, params, token)
},
post: function (url, params, token) {
return apiAxios('POST', url, params, token)
},
put: function (url, params, token) {
return apiAxios('PUT', url, params, token)
},
delete: function (url, params, token) {
return apiAxios('DELETE', url, params, token)
},
}
以下是Vue的封装
Vue推荐封装一下前端api接口,这样可根据函数名判断类型和url给axios文件,不用每次发送请求的时候都手动输入url,方便维护和开发。
import http from '../http/http.js'
export default {
login(data, token){
return http.post("/login",data, token)
},
getUserInfo(data, token){
return http.get("/getUserInfo",data, token)
}
}
import api from './api/api.js'
//定义全局变量
Vue.prototype.$api = api
前端页面用this.$api.urlName()的格式发送请求即可
由于是异步操作,axios返回的是promise对象,所以要用 .then的形式接收后端发回来的response,然后做出相应的反馈。
//直接用this.$api调用api中接口,如果不封装api接口可以用this.$http
this.$api.login(data, token).then((res) => {
console.log(res)
}).catch((err) => {
console.log(res)
})
这套方法同样适用于React,方法大同小异,暴露出接口就行。也可以直接import文件后用http.method的形式发送请求。