You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
3.5 KiB

import axios, { AxiosRequestConfig } from 'axios'
import { getHost } from '../url'
import { ApiConfig } from './config'
import {
autoWithClientToken,
calcRequestTimeEnd,
calcRequestTimeStart,
handleError,
printResData,
printResUrlTime,
reThrowError,
rewriteApiUrl,
} from './interceptors'
const JSONbigString = require('json-bigint')({ storeAsString: true })
import type { OutgoingHttpHeaders } from 'http'
import { createStandaloneToast } from "@chakra-ui/react"
import { getToken } from './getToken'
const toast = createStandaloneToast()
axios.defaults.transformResponse = [
text => {
return JSONbigString.parse(text)
},
]
/**
* (Ajax)使axios
* > proxy
*/
const requestApiConfig: AxiosRequestConfig = {
baseURL: ApiConfig.target + ApiConfig.proxyApi,
timeout: ApiConfig.timeout,
// withCredentials: true,
}
const requestApi = axios.create(requestApiConfig)
// 自动携带token
requestApi.interceptors.request.use(autoWithClientToken)
// 开始计算请求时间
requestApi.interceptors.request.use(calcRequestTimeStart)
// 结束计算请求时间
requestApi.interceptors.response.use(calcRequestTimeEnd)
// 打印请求url
requestApi.interceptors.response.use(printResUrlTime)
// 打印返回值信息
requestApi.interceptors.response.use(printResData)
// 对返回信息进行处理
requestApi.interceptors.response.use(
response => {
return response.data
},
error => {
let message = "error msg missing"
let status = 200
if (error.response && error.response.data) {
message = error.response.data.message
status = error.response.status
} else {
message = error.text ?? error.message
}
if (status !== 401) {
4 years ago
toast({
title: `请求错误`,
description: message,
status: "error",
duration: 2000,
isClosable: true,
})
4 years ago
}
// 这么写是为了保证请求调用方在await中等待的都是正确的返回数据就不用对数据进行二次错误判断
throw(error.message)
// return error.response
}
)
// 抛出被服务端吞掉的错误
requestApi.interceptors.response.use(reThrowError)
/**
*
* 使axios
* ,使,
*/
const createRequestRoot = (headers?: OutgoingHttpHeaders) => {
let baseURL = ApiConfig.target
if (ApiConfig.changeOrigin) {
headers.host = getHost(ApiConfig.target)
if (ApiConfig.useProxyOrigin) {
baseURL += ApiConfig.proxyApi
}
}
const requestRoot = axios.create({
baseURL,
timeout: ApiConfig.timeout,
headers,
})
// 转发到target前去除^/api前缀
requestRoot.interceptors.request.use(rewriteApiUrl)
// 开始计算请求时间
requestRoot.interceptors.request.use(calcRequestTimeStart)
// 结束计算请求时间
requestRoot.interceptors.response.use(calcRequestTimeEnd)
// 打印请求url 捕获异常
requestRoot.interceptors.response.use(printResUrlTime, handleError)
return requestRoot
}
const createPureRequest = (config?: AxiosRequestConfig) => {
const request = axios.create(config)
request.interceptors.request.use(calcRequestTimeStart)
request.interceptors.request.use(rewriteApiUrl)
request.interceptors.response.use(calcRequestTimeEnd)
request.interceptors.response.use(printResUrlTime, handleError)
return request
}
export { requestApi, createRequestRoot, createPureRequest }