Request封装

request的封装主要分为三部分,axios的创建、请求拦截器、响应拦截器、导出axios

一、引入axios

引入前先下载依赖:

npm install axios

 引入

import axios from 'axios';

二、创建axios

设置一个变量来存储根域名,baseURL是请求服务器根域名,timeout超时时间限制

let BASE_URL = 'http://192.168.0.103'
// 配置新建一个 axios 实例
const service = axios.create({
	baseURL: BASE_URL,
	timeout: 50000,
});

三、创建请求拦截器

在开发项目中不可缺少的就是token,一般放在vuex创建的store中或者本地存储,请求时配置请求头携带token,可根据项目指定的前后端标准去自行配置即可。在错误回调中要return 异常(Promise.reject(error))

补充:Promise对象可以处于三种状态:pending(待定)fulfilled(已兑现),和rejected(已拒绝)

//service.interceptors.request.use中有两个回调函数,一个是config一个是error,用箭头函数去接收这两个回调
service.interceptors.request.use(
	(config) => {
		// 验证token
		if (localStorage.getItem('token')) {
			config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
		}
		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

四、创建响应拦截器

响应拦截器就是后端返回你数据是做的一系列操作。

自定义一个变量接收response.data(其中可以根据response返回的结构去获取内容)

//service.interceptors.response.use中有两个回调函数,一个response,一个error
service.interceptors.response.use(
  response => {
    const res = response.data
    // 自定义状态码验证 (code是后端返回的需要与后端统一约定)
    if (res.code !== 200) {
      ElMessage.error(res.message || 'Error')
      return Promise.reject(new Error(res.message || 'Error'))
    } else if... 
     else {
      return res
    }
  },
  error => {
    // 处理HTTP网络中的错误(status)
    let message = ''
    if (error && error.response) {
      switch (error.response.status) {
        case 401:
          message = "认证失败,请重新登录"
          break
        case 403:
          message = "当前操作没有权限"
          break
        case 404:
          message = "资源不存在"
          break
        case 500:
          message = "接口异常"
          break
        default:
          message = "网络异常,请稍后重试"
      }
    }
    ElMessage.error(message)
    return Promise.reject(error)
  }
)

五、导出 axios

export default service;

完整代码: 

import axios from 'axios';
import { ElMessage} from 'element-plus';

let BASE_URL = 'http://192.168.0.103'
// 配置新建一个 axios 实例
const service = axios.create({
	baseURL: BASE_URL,
	timeout: 50000,
});

// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// 验证token
		if (localStorage.getItem('token')) {
			config.headers['Authorization'] = `Bearer ${localStorage.getItem('token')}`;
		}
		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

// 添加响应拦截器
// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    // 自定义状态码验证 (code是后端返回的需要与后端统一约定)
    if (res.code !== 200) {
      ElMessage.error(res.message || 'Error')
      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    // 处理HTTP网络中的错误(status)
    let message = ''
    if (error && error.response) {
      switch (error.response.status) {
        case 401:
          message = "认证失败,请重新登录"
          break
        case 403:
          message = "当前操作没有权限"
          break
        case 404:
          message = "资源不存在"
          break
          case 500:
          message = "接口异常"
          break
        default:
          message = "网络异常,请稍后重试"
      }
    }
    ElMessage.error(message)
    return Promise.reject(error)
  }
)

// 导出 axios 实例
export default service;

有什么优化和见解可以随时评论沟通!作者是打着学习吸取经验发布的文章,望指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值