前端对axios的封装和使用

Axios 是一个基于 promise 的 HTTP 库。将axios封装好后能更高效的开发并且方便维护,而且在以后的项目中也能直接套用,所以封装好是必要的。在参考了很多方法后,我拼凑出了一套我认为很实用的方法。

helper.js

这个是功能性文件是拼接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

http.js

接收前端发来的请求,处理后发往后端

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的封装

api.js

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)
  }
}
在main.js中引用后就可以全局调用了
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的形式发送请求。

你可能感兴趣的:(前端)