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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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) {
toast({
title: `请求错误`,
description: message,
status: "error",
duration: 2000,
isClosable: true,
})
}
// 这么写是为了保证请求调用方在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 }