vue封装axios

axios是vue基于promiseajax的⼀种封装。

功能特点 :
1. 在浏览器中发送 XMLHttpRequests 请求
2. node.js 中发送 http 请求
3. ⽀持 Promise API
4. 拦截请求和响应
5. 转换请求和响应数据
在使⽤ axios 之前,需要在 Vue-CLI 中先去安装它
npm install axios --save
在要使⽤的组件中直接引⼊调⽤即可
import axios from 'axios'
axios 的基本使⽤
//使⽤默认⽅式发送⽆参请求
import axios from "axios";
axios({
 url: 'https://api.muxiaoguo.cn/api/lishijr'
}).then(res => {
 console.log(res)
})
//默认使⽤get⽅式进⾏请求

axios的响应结构

//与jquery中的ajax不同的是,axios会对返回结果进⾏封装,将其封装为如
下结构:
{
 data:{}, //后台返回的数据
 status:200, //状态码
 statusText: 'OK', //状态信息
 headers:{}, //服务器头部信息
 config:{}, //axios对request的配置
 request:{} //request对象
}
axios 的拦截器
axios 给我们提供了两⼤类拦截器
⼀种是请求⽅向的拦截(成功请求,失败请求)
另⼀种是响应⽅向的(成功响应,失败响应)
拦截器的作⽤:⽤于我们在⽹络请求的时候在发起请求或者响应时对操
作进⾏相应的处理
//请求⽅向拦截器
import axios from "axios";
// 拦截器
axios.interceptors.request.use(config => {
 // 可以在请求拦截器⾥做什么呢?
 // 1.当⽤户发送⽹络请求的时候 在⻚⾯中添加⼀个loading组件 作为动
画
 // 2.⽤户登录的时候 判断⽤户是否有token 有的话就跳转到界⾯ 没有
的话就返回到登录界⾯或提示报错
 // 等等。。。
 console.log('进⼊请求拦截器')
 console.log(config)
 return config //记得return,放⾏请求
},err => {
 console.log('请求⽅向失败')
 console.log(err)
})
axios.get('https://api.muxiaoguo.cn/api/lishijr').then(res
=> {
 console.log(res)
})
//响应⽅向拦截器
import axios from "axios";
axios.interceptors.response.use(config => {
 //可以在响应拦截器⾥做什么呢?
 //可以拿到请求响应的状态码 根据状态码去做⼀些判断
 console.log('状态码', config.data.status);
 console.log('进⼊响应拦截器')
 return config.data //只会返回data
},err => {
 console.log('响应⽅向失败')

我们可以对axios再次封装,通过async 和 await 调用封装的方法

axios.js

import axios from 'axios'
import router from '../router/index'
import Vue from 'vue';
import { Toast } from 'vant';
import qs from 'qs'

Vue.use(Toast);

let token = '';
// 1. 基础路径

axios.defaults.baseURL = ''

axios.defaults.headers.post['Content-Type'] = 'application/json';//配置请求头

// http request拦截器 添加一个请求拦截器
// axios.interceptors.request.use(function (config) {
//   let token = localStorage.getItem("token")
//   if (token) {
//     //将token放到请求头发送给服务器,将token放在请求头中
//     config.headers['Authorization'] = token
//   }
//   return config;
// }, function (error) {
//   Toast.fail('请求超时');
//   // Do something with request error
//   return Promise.reject(error);
// });

// // 添加一个响应拦截器
// axios.interceptors.response.use(function (response) {
//   // if (response.data && response.data.code) {
//   //   if (response.data.message === 'token失效' || response.data.message === '请求头中没有token') {
//   //     //未登录
//   //     Toast.fail("登录信息已失效,请重新登录");
//   //     router.push('/login');
//   //   }
//   //   if (parseInt(response.data.code) === -1) {
//   //     Toast.fail("请求失败");
//   //   }
//   // }
//   return response;
// }, function (error) {
//   Toast.fail("服务器连接失败");
//   return Promise.reject(error);
// })

/**
  get方式请求
*/
export function get(baseURL,url, params) {
  axios.defaults.baseURL = baseURL
  return axios({
    method: 'get',
    url,
    params, // get 请求时带的参数
    timeout: 50000
  })
}

/**
 * 提交post请求 发送的数据为查询字符串,key=val&key=val
*/
export function post(baseURL,url, data) {
  axios.defaults.baseURL = baseURL
  return axios({
    method: "post",
    url,
    data: qs.stringify(data),
    timeout: 5000,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    }
  })
}

/**
 * 提交post请求 ,查询字符串,对象中嵌套数组的格式
*/
export function post_obj_array(baseURL,url, data) {
  axios.defaults.baseURL = baseURL
  return axios({
    method: "post",
    url,
    data: qs.stringify(data, { allowDots: true }),
    timeout: 5000
  })
}

/**
 * 提交post请求 发送的数据为查询字符串,当参数为数组的时候适用该方法
 * ids=1&ids=2
*/
export function post_array(baseURL,url, data) {
  axios.defaults.baseURL = baseURL
  return axios({
    method: "post",
    url,
    data: qs.stringify(data, { arrayFormat: "repeat" }),
    timeout: 5000
  })
}
/**
 * 提交post请求 发送的数据为json字符串
*/
export function post_json(baseURL,url, data) {
  axios.defaults.baseURL = baseURL
  return axios({
    method: "post",
    url,
    data,
    timeout: 5000
  })
}

export default axios

async 和 await 一般需要一起使用,async用于方法名称前,await用于调用的方法的前,

简单来说await让发送的网络请求有序,

例如:第二个请求需要第一个请求返回的数据作为参数,但用封装方法发送网络请求不会异步,会同步发送请求,这就导致可能会发生错误,用axios来做可能会产生回调地狱的情况。

使用await可以让axios异步发送请求。

先引入axios.js

import { get, post_json } from "../http/axios";

具体的使用方法

async onSubmit() {
      //请求参数
      let data = {
        password: this.password,
        username: this.username,
      };
      //请求地址
      let baseURL_swaggle = "http://47.100.84.201:8888/";
      let Rubres = await post_json(baseURL_swaggle, "user/login", data);

      if (Rubres.data.status == 200) {
      } else {

        Dialog.alert({

        }).then(() => {
          // on close
        });
      }
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值