Skip to content

请求处理

sunlight-admin 使用 axios 进行 HTTP 请求处理,包含了请求拦截器、响应拦截器、错误处理等功能。

项目配置

typescript
const request = axios.create({
  // 默认地址请求地址,可在 .env.** 文件中修改
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 30 * 1000, // Timeout
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
  }
  // 跨域时候允许携带凭证
  // withCredentials: true
})

请求拦截器

在发送请求之前执行处理操作,主要用于 token 注入:

typescript
request.interceptors.request.use(
  config => {
    // 在发送请求之前执行处理操作
    const token = getToken()
    if (token) {
      config.headers.Authorization = token
    }
    return config
  },
  error => {
    // 对请求错误执行处理操作
    return Promise.reject(error)
  }
)

响应拦截器

对服务器返回的响应进行统一处理:

typescript
request.interceptors.response.use(
  response => {
    return response.data
  },
  async error => {
    const { response } = error
    // 根据服务器响应的错误状态码,做不同的处理
    if (response) checkStatus(response.status)
    // 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面
    const isOnline = await isOnLine()
    if (!isOnline) router.replace('/500')
    return Promise.reject(error)
  }
)

错误处理

状态码检查

typescript
export const checkStatus = (status: number) => {
  switch (status) {
    case 400:
      ElMessage.error('请求失败!请您稍后重试')
      break
    case 401:
      ElMessage.error('登录失效!请您重新登录')
      break
    case 403:
      ElMessage.error('当前账号无权限访问!')
      break
    case 404:
      ElMessage.error('你所访问的资源不存在!')
      break
    case 405:
      ElMessage.error('请求方式错误!请您稍后重试')
      break
    case 408:
      ElMessage.error('请求超时!请您稍后重试')
      break
    case 500:
      ElMessage.error('服务异常!')
      break
    case 502:
      ElMessage.error('网关错误!')
      break
    case 503:
      ElMessage.error('服务不可用!')
      break
    case 504:
      ElMessage.error('网关超时!')
      break
    default:
      ElMessage.error('请求失败!')
  }
}

网络状态检测

typescript
export function isOnLine() {
  let img = new Image()
  img.src = 'https://www.baidu.com/favicon.ico?_t=' + Date.now()
  return new Promise(resolve => {
    img.onload = function () {
      resolve(true)
    }
    img.onerror = function () {
      resolve(false)
    }
  })
}

Token 管理

typescript
import Cookies from 'js-cookie'

const TokenKey = 'bk_token' // 自定义修改

export function getToken() {
  return Cookies.get(TokenKey)
}

export function setToken(token: any) {
  return Cookies.set(TokenKey, token)
}

export function removeToken() {
  return Cookies.remove(TokenKey)
}

使用示例

typescript
import request from '@/plugins/request'

// GET 请求
request.get('/api/user', { params: { id: 1 } })
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.error(err)
  })

// POST 请求
request.post('/api/user', { name: 'test', age: 18 })
  .then(res => {
    console.log(res)
  })
  .catch(err => {
    console.error(err)
  })