37.axios

103 阅读2分钟

之前将vue的时候漏掉的.补发一下

axios是什么

使用vue的小伙伴对于axios应该都不会陌生,从vue2.0开始 尤大大就开始推荐开端开发中使用axios来管理,发送请求.axios就成为了vue全家桶中重要的一部分. axios是基于promise的网络请求库,在服务端它使用原生node.js http模块, 而在客户端 (浏览端) 则使用XMLHttpRequest。

安装和使用

安装

yarn add axios
npm install axios

直接使用

import axios from "axios";
axios.get("192.168.0.1").then((res) => {
  console.log(res);
});
axios
  .get({
    url: "192.168.0.1",
    method: "put",
  })
  .then((res) => {
    console.log(res);
  });

post同理

{
  // 路径url
  url: '/user',

  // 请求方法,默认get
  method: 'get', 

  //基础url,最终请求的url是 baseURL+url拼接,所以再全局设置默认,可以使得发送请求时的url变得简洁
  baseURL: 'https://some-domain.com/api/',

  //设置请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  //设置请求url的query参数,可以使得url简洁。
  //比如url是https://some-domain.com/api/user  然后params如下设置,那么最终的url是:
  //https://some-domain.com/api/user?ID=12345&name=Jack
  params: {
    ID: 12345,
    name:"Jack"
  },


 //设置请求体
  data: {
    firstName: 'Fred'
  },
  
  //设置请求的另外一种格式,不过这个是直接设置字符串的
  data: 'Country=Brasil&City=Belo Horizonte',

 //请求超时,单位毫秒,默认0,不超时。
  timeout: 1000,

  //响应数据类型,默认json
  responseType: 'json', 

  //响应数据的编码规则,默认utf-8
  responseEncoding: 'utf8',


	//响应体的最大长度 
  maxContentLength: 2000,

  // 请求体的最大长度
  maxBodyLength: 2000,

  //设置响应状态码为多少时是成功,调用resolve,否则调用reject失败
  //默认是大于等于200,小于300
  validateStatus: function (status) {
    return status >= 200 && status < 300; 
  },

封装axios

基本配置

可以配置超时时间(TimeOut),基础地址(baseURL),编码规则(responseEncoding)等等

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 配置开发环境的baseApi
  timeout: 5000 // 超时时间
})

请求拦截器

在请求拦截器service.interceptors.request.use()中,我们可以统一添加token,刷新token,统一请求头添加,编码协议等等

service.interceptors.request.use(config => {
  // 注入token 判断token在不在
  if (store.getters.token) {
    // 判断是否超时
    if (checkTimeOut()) {
      // 超时了 删除token 跳到登录页
      refreshToken()
    }
    config.headers['Authorization'] = `Bearer ${store.getters.token}`
  }
  return config // config必须返回
}, error => {
  return Promise.reject(error)
})

响应拦截器

在响应拦截器中我们可以统一的处理请求错误,

request.instance.interceptors.response.use(
  function (response) {
    if (response.status !== 200) {
      console.error("网络错误....");
      toast.error(response.data?.message ?? response.data.toString());
    } else {
      // 下载文件用
      if (
        (response.request && response.request.responseType === "blob") ||
        response.data.code === undefined
      ) {
        return response;
      }
      return response.data;
    }
  },
      if (response.code === "9003004") {
      await actions.refreshToken();
      return await Request(api, url, params, options);
    }
    if (response.code == 50010 || response.code == "9003008") {
      actions.loginOut();
    }
    if (response.code !== "00000" && api.topTips) {
      // 需要顶部错误提示时执行
      toast.error(response.message);
    }
  function (error) {
    toast.error(error.toString() ?? "未知异常,请联系管理员");
    return Promise.reject(error);
  }
);

封装请求

统一请求的的地址,参数.类型管理

import request from '@/utils/request'
export function login(data) {
  return request({
    url: '/sys/login',
    method: 'POST',
    data
  })
}

使用请求

在组件的引入放方法,配合async,await和解构赋值使用

import { getUserDetailById } from "@/api/user";
    async getJobDetail() {
      const userInfo = await getUserDetailById(this.userId);
    },