anxios封装拦截器的两种方式

这篇具有很好参考价值的文章主要介绍了anxios封装拦截器的两种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 函数方式

import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "view-ui-plus";

export const createAxiosByinterceptors = (
	config?: AxiosRequestConfig
): AxiosInstance => {
	const instance = axios.create({
		timeout: 1000, //超时配置
		withCredentials: true, //跨域携带cookie
		...config, // 自定义配置覆盖基本配置
	});

	// 添加请求拦截器
	instance.interceptors.request.use(
		(config: any) => {
			// 在发送请求之前做些什么
			console.log("config:", config);
			return config;
		},
		(error) => {
			// 对请求错误做些什么
			return Promise.reject(error);
		}
	);

	// 添加响应拦截器
	instance.interceptors.response.use(
		(response) => {
			// 对响应数据做点什么
			console.log("response:", response);
			const { code, data, message } = response.data;
			if (code === 200) return data;
			else if (code === 401) {
				// 退出处理
			} else {
				Message.error(message);
				return Promise.reject(response.data);
			}
		},
		(error) => {
			// 对响应错误做点什么
			console.log("error-response:", error.response);
			console.log("error-config:", error.config);
			console.log("error-request:", error.request);
			if (error.response) {
				if (error.response.status === 401) {
					// 退出处理
				}
			}
			Message.error(error?.response?.data?.message || "服务端异常");
			return Promise.reject(error);
		}
	);
	return instance;
};

使用方法

import { createAxiosByinterceptors } from "@/service/service";

const request = createAxiosByinterceptors({
	baseURL: "/sdkjfdk",
});

//lodaing配置
export const appList = (params: any): Promise<any> =>
	request.get("/app", { params, loading: true }); // 不需要默认的全局loading效果可配置loading为false关闭 loading默认为true

// 文件下载
export const exportGoods = (data: any) =>
	request.post("/export", data, {
		responseType: "blob",
	});

export const expordtGoods = (data: any) =>
	request.put("/export", data, {
		responseType: "blob",
	});

讲解:函数式通过调用方法创建axios实例,通过参数传入基础url,超时时间等定义参数。
使用时比较接近axios写法。

2. 类方法

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
import { Message } from 'view-design';
const $Message: any = Message;
export class HttpService {
  private instance: AxiosInstance;
  baseConfig: AxiosRequestConfig = { baseURL: "/commonApi" };
  constructor(baseURL?: string, timeout?: number) {
    // 使用axios.create创建axios实例
    this.instance = axios.create({ ...this.baseConfig, baseURL, timeout });
    // 请求拦截器
    this.instance.interceptors.request.use((config: AxiosRequestConfig) => {
      return config;
    }, (error: any) => {
      return Promise.reject(error);
    })
    // 响应拦截器
    this.instance.interceptors.response.use((response: AxiosResponse) => {
      if (response.request.responseType === 'blob') { // 流文件
        return response
      }
      const { retcode, code, status, message, msg, desc } = response.data;
      let msgStr = message || msg || desc || '系统异常,请联系管理员';
      if ((retcode && retcode === 200) || (code && code === 0)) {
        return Promise.resolve(response.data);
      } else if (!status) {
        return Promise.resolve(response.data);
      } else {
        $Message.error(msgStr);
        return Promise.reject(response.data);
      }
    }, (error: any) => {
      const { status, data } = error.response
      const { msg, message, desc } = data
      const errMsg = msg || message || desc || '系统异常,请联系管理员';
      switch (status) {
        case 401:
        // 这里可以做清空storage并跳转到登录页的操作
        case 400:
        case 403:
        case 404:
        case 408:
        case 500:
        case 501:
        case 502:
        case 503:
        case 504:
        case 505:
        default:
          $Message.error(errMsg);
      }
      return Promise.reject(error);
    })
  }

  /**
   * commonRequest
   */
  public commonRequest(config: AxiosRequestConfig): Promise<AxiosResponse> {
    return this.instance(config)
  }
}

使用方法

import { HttpService } from '../interceptors'

const proxyPrefix: string = '/proxyApi';
const $docQaReq: any = new HttpService(proxyPrefix)

export const apiUrl = {
  docFileUpload: `${proxyPrefix}/doc/semantic-doc/document/file/upload`,
}

/**
 * @description 获取所有文档库标签(以及文档
 * @param type 1 为文档标签,不传则为文档库标签
 */
export const getAllLibLabel = (data?: {
  type: number;
}) => {
  return $docQaReq.commonRequest({
    url: `/doc/semantic-doc/label/list`,
    method: 'get',
    params: data? data: null
  })
}

/**
 * @description 新增文档库标签(以及文档
 * @param type 1 为文档标签,不传则为文档库标签
 */
export const creatLibLabel = (data: {
  name: string;
  type?: number;
}) => {
  return $docQaReq.commonRequest({
    url: '/doc/semantic-doc/label/create',
    method: 'post',
    data
  })
}

类方法: 通过创建一个类,传入baseUrl,超时时间等自定义参数。使用时候调用类的方法实现创建axios实例。
两种方法写法不同,功能相同。文章来源地址https://www.toymoban.com/news/detail-806331.html

到了这里,关于anxios封装拦截器的两种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UniApp 封装全局请求示例并配置拦截器以及错误回调指南

    本文将介绍如何在 UniApp 中封装全局请求示例,并配置请求拦截器和错误回调函数,以便统一处理网络请求、添加请求头、处理错误等功能。通过本指南,你将学习如何优化请求流程并提高代码的可维护性。 首先,确保你已经创建了一个 UniApp 项目。 在项目的根目录下创建一

    2024年02月08日
    浏览(41)
  • 以配置的方式开关axios拦截器功能

    前景提要: ts 简易封装 axios,统一 API axios 很多额外功能都是基于拦截器实现。有些功能想要全局使用,因此将拦截器注册在全局。比如重复请求过滤。但也有一小部分请求不希望进行过滤,比如并发上传文件。 因此希望可以在具体的请求方法上,通过配置 config 从而决定针

    2024年02月06日
    浏览(40)
  • .Net Core Entity Framework Core 的基础封装 -数据库操作拦截器

    自己制作的一个基于Entity Framework Core 的数据库操作拦截器,可以打印数据库执行sql,方便开发调试,代码如下: 运行结果如下:  

    2024年02月22日
    浏览(50)
  • vue全家桶进阶之路47:Vue3 Axios拦截器封装成request文件

    可以将Axios拦截器封装成一个单独的request文件,以便在整个应用程序中重复使用。 以下是一个示例,展示如何将Axios拦截器封装成一个request文件: 1、创建一个名为request.js的新文件,并导入Axios: 2、创建一个名为request的函数,并将其导出: 这将创建一个名为request的函数,

    2023年04月21日
    浏览(50)
  • 【axios网络请求库】认识Axios库;axios发送请求、创建实例、创建拦截器、封装请求

    功能特点: 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 http请求 支持 Promise API 拦截请求和响应 转换请求和响应数据 支持多种请求方式: axios(config) axios.request(config) axios.get(url[, config]) axios.delete(url[, config]) axios.head(url[, config]) axios.post(url[, data[, config]]) axios.put(url[, data[, c

    2024年02月10日
    浏览(42)
  • 【Java Web】用拦截器的方式获取用户信息

    流程:从cookie中获取凭证,根据凭证查询用户,并在本次请求中持有用户,在视图模板上显示登录用户的信息。 1. 定义拦截器 2. 配置拦截器

    2024年02月10日
    浏览(42)
  • 登录认证方式汇总,例如ThreadLocal+拦截器+Redis、JWT

    先讲讲传统的登录方式 用cookie作为媒介存放用户凭证。 用户登录系统之后,会返回一个加密的cookie,当用户访问子应用的时候会带上这个cookie,授权以解密cookie并进行校验,校验通过后即可登录当前用户。 缺点: Cookie不安全,Cookie是存到客户端的,攻击者可以伪造Cookie伪造

    2024年02月07日
    浏览(42)
  • uniapp封装一个网络请求的服务,包括拦截器,请求头等,适用于抖音小程序,各种小程序。

    今天用uniapp写抖音小程序的时候,发现抖音小程序不支持axios(也许是我不会玩哈),那使用uniapp提供的请求方式总是可以的,毕竟uniapp对于小程序的友好度那是真没的说呀。那每个请求都写一套请求代码也太麻烦了,封装一个服务吧。直接上代码,我们把下面这个文件叫做

    2024年02月07日
    浏览(46)
  • 超详细!完整版!基于spring对外开放接口的签名认证方案(拦截器方式)

    由于项目需要开发第三方接口给多个供应商,为保证Api接口的安全性,遂采用Api接口签名验证。 请求发起时间得在限制范围内 请求的用户是否真实存在 是否存在重复请求 请求参数是否被篡改 1、服务端生成一对 accessKey/secretKey密钥对,将 accessKey公开给客户端,将 secretKey 保

    2024年01月22日
    浏览(53)
  • 关于axios的两种拦截方式:请求拦截和响应拦截

    提示:这里可以添加本文要记录的大概内容: 提示:以下是本篇文章正文内容,下面案例可供参考 axios.interceptors.request.use() 请求拦截 axios.interceptors.request.use( function ( config ) { return config }) 这个方法的参数是一个函数,发送请求之前就会执行这个函数,函数里面的参数就是执

    2024年01月24日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包