美文网首页
ts-axios封装

ts-axios封装

作者: 男人宫 | 来源:发表于2024-04-14 15:33 被阅读0次

index.ts封装

import axios  from 'axios'
import type { AxiosInstance, AxiosError,InternalAxiosRequestConfig,AxiosResponse,AxiosRequestConfig } from 'axios'
import {ElMessage} from 'element-plus'


const URL:string = ""

enum RequestEnums {
  TIMEOUT = 20000,
  OVERDUE = 600, //登录失败
  FAIL = 999, //请求失败
  SUCCESS = 200, //登录成功的code
}


const instance:AxiosInstance = axios.create({
  baseURL:"/app",
  timeout:500000
})
instance.interceptors.request.use((config:InternalAxiosRequestConfig)=>{
  const token = localStorage.getItem("token")
   if(token){
    config.headers.Authorization = "Bearer " + token
   }
  return config
},(error:AxiosError)=>{
  return Promise.reject(error)
})

instance.interceptors.response.use((
  response:AxiosResponse
)=>{
  console.log(response);
const { status, data, message} = response.data
if(status == 200){
  return data
}else if(status == 1000){
  ElMessage.error("没有登录")
}else{
  ElMessage.error(message)
}
return Promise.reject(new Error(message))
},(error:AxiosError)=>{
  let message = ""
  let Status= error.response?.status
  if(Status){
    switch(Status){
      case 401:
        message = "token过期"
        break
      case 403:
        message = "无权访问"
        break
      case 404:
        message = "请求地址错误"
        break
      case 500:
        message = "服务器出现问题"
        break
      default:
        message = "其他错误"
    }
  }
  ElMessage.error(message)
  return Promise.reject(error)
})

const http = {
  get<T = any>(url:string,config?:AxiosRequestConfig):Promise<T>{
    return instance.get(url,config)
  },

  post<T=any>(url: string, data?: object, config?: AxiosRequestConfig): Promise<T> {
    return instance.post(url, data, config)
  }

 
}
 
 export default http
 

使用

import http from "@/request"
interface Result <T=any>{
  dept_names:number | null,
  message:string,
  timestamp:string,
  roleInfos:T,
  fullname:string | null,
}
 http.get< Result >("/cyber/user/info").then(res =>{
        console.log("res=",res);
        const store = useUserStore()
        let isShiBM = false
        for (let i in res.roleInfos) {
          let role = res.roleInfos[I]
          if (role.code == 'BMRY') { 
              for (let j in role.info_list) {
                  if (role.info_list[j].org_id === 0) {
                      isShiBM = true
                      break
                  }
              }
              break
          }
         }
        store.changeUserInfo(res,res.fullname,res.roleInfos,isShiBM)
        next()
       })

对业务接口的二次封装

WeChatabf46f9cc56d854a51669ade72875f6d.jpg

index.ts文件

// 用户有关的接口
import  http  from '@/request/index';
import type { Result } from "./types"

export function getUserInfo() {
return http.get<Result>("/cyber/user/info");
}

types.ts文件

// 用户有关的类型定义
export interface Result <T=any>{
 dept_names:number | null,
 message:string,
 timestamp:string,
 roleInfos:T,
 fullname:string | null,
}

具体使用

import { getUserInfo } from "@/assets/api/user"
router.beforeEach(async (to,from,next)=>{
  console.log(to.name);
    let token = localStorage.getItem("token")
    if(token){
      //  http.get<Result>("/cyber/user/info").then(res =>{
      //   console.log("res=",res);
      //   const store = useUserStore()
      //   let isShiBM = false
      //   for (let i in res.roleInfos) {
      //     let role = res.roleInfos[i]
      //     if (role.code == 'BMRY') { //部门人员
      //         for (let j in role.info_list) {
      //             if (role.info_list[j].org_id === 0) { //市级部门人员(里面的市教育人的角色)
      //                 isShiBM = true
      //                 break
      //             }
      //         }
      //         break
      //     }
      //    }
      //   store.changeUserInfo(res,res.fullname as string,res.roleInfos,isShiBM)
      //   next()
      //  })
      let res = await getUserInfo()
         console.log("66666=",res);
        const store = useUserStore()
        let isShiBM = false
        for (let i in res.roleInfos) {
          let role = res.roleInfos[i]
          if (role.code == 'BMRY') { //部门人员
              for (let j in role.info_list) {
                  if (role.info_list[j].org_id === 0) { //市级部门人员(里面的市教育人的角色)
                      isShiBM = true
                      break
                  }
              }
              break
          }
         }
        store.changeUserInfo(res,res.fullname as string,res.roleInfos,isShiBM)
        next()
    }
})

相关文章

  • 四、错误处理-需求分析-网络错误+非200状态码

    在前一章节,我们实现了ts-axios的Promise封装和构建,完成了请求发送成功和成功获取数据后的处理操作。本...

  • 8-4、自定义合法化状态码

    需求 之前ts-axios在处理响应结果的时候,认为HTTP status在200和300之间是一个合法值,在这个...

  • 五、重构项目结构

    在前面的几章内容中,我们已经实现了ts-axios的发送请求、处理请求、Promise化等操作,同时也处理错误的处...

  • 7、ts-axios 取消功能

    需求 有些场景下,我们希望能主动取消请求,比如常见的搜索框案例,在用户输入过程中,搜索框的内容也在不断变化,正常情...

  • 6-1、ts-axios配置化实现

    需求 我们在发送请求的时候,可以传入配置,来决定请求的不同行为。我们也希望ts-axios可以有默认配置,定义一些...

  • 七、实现ts-axios的默认参数设置

    我们希望给ts-axios传入一些默认的参数,可以在没有传递参数的时候,设置一些必须的参数。本片文章,我们就来实现...

  • 3-1、处理异常情况

    需求 之前的内容,我们完成了ts-axios的基础功能,但目前为止,我们都是处理的正常接收请求的情况,这对于一个程...

  • 六、实现拦截器功能

    本篇我们来实现ts-axios的拦截功能,拦截功能就是可以在请求发送之前和受到服务端接口返回的数据之后做一些工作。...

  • 8-3、ts-axios http授权

    HTTP协议中的Authorization请求header会包含服务器用于验证用户代理身份的凭证,通常会在服务器返...

  • JavaScript面向对象与设计模式

    1. 面向对象 1.1 封装 封装的目的在于将信息隐藏。广义的封装不仅包括封装数据和封装实现,还包括封装类型和封装...

网友评论

      本文标题:ts-axios封装

      本文链接:https://www.haomeiwen.com/subject/owdrxjtx.html