HttpRequestBase 类
1 构造函数
constructor ( baseUrl ) {
const basePort = getUrlPort ( baseUrl) ;
this . baseUrl = baseUrl;
this . baseUrlWithPort2 = baseUrl. replace ( / (\/\/.*:)(\d+) / , ` $1 ${ basePort + 1 } ` ) ;
this . basePort = basePort;
this . queue = { } ;
this . triggerTime = '' ;
this . alikeUrl = [ ] ;
this . CancelToken = axios. CancelToken;
this . removeAlikeUrl = config => {
let configUrl =
config. url. indexOf ( config. baseURL) !== - 1
? config. url. substring ( config. baseURL. length, config. url. length)
: config. url;
for ( var i = this . alikeUrl. length - 1 ; i >= 0 ; i-- ) {
if ( this . alikeUrl[ i] . u === configUrl + '&' + config. method) {
this . alikeUrl[ i] . cancel ( 'axios请求被取消' ) ;
this . alikeUrl. splice ( i, 1 ) ;
break ;
}
}
} ;
}
2 事件处理程序
2.1 请求封装
request ( options ) {
const instance = axios. create ( ) ;
options = this . getInsideConfig ( options) ;
this . interceptors ( instance, options. url) ;
return instance ( options) ;
}
2.2 请求参数处理
transformRequest
允许在向服务器发送前修改请求数据,只能用put post patch请求方法
getFinalBaseURL ( apiUrl ) {
return checkIsUsePort2 ( apiUrl, this . basePort) ? this . baseUrlWithPort2 : this . baseUrl;
}
getInsideConfig ( options ) {
const config = {
baseURL : this . getFinalBaseURL ( options. url) ,
headers : {
'Content-Type' : 'application/x-www-form-urlencoded' ,
Authorization : SessionIdConfigure. getLocalId ( )
} ,
transformRequest : [
data => {
let ret = '' ;
for ( var i in data) {
if ( data[ i] instanceof Array ) {
for ( var j in data[ i] ) {
ret += i + '=' + (
typeof data[ i] [ j] === 'object'
? JSON . stringify ( data[ i] [ j] )
: encodeURIComponent ( data[ i] [ j] )
) + '&' ;
}
} else {
if (
! ( String ( data[ i] ) === 'null' || String ( data[ i] ) === 'undefined' ) &&
String ( data[ i] ) . indexOf ( 'NaN-aN-aN' ) === - 1
) {
ret += i + '=' + encodeURIComponent ( data[ i] ) + '&' ;
} else {
ret += i + '=&' ;
}
}
}
return ret;
}
] ,
... options
}
return config;
}
2.3 取消loading效果
destroy ( url ) {
if ( this . queue[ url] ) delete this . queue[ url] ;
if ( ! Object. keys ( this . queue) . length) {
store. commit ( 'appLoading/display' , false ) ;
}
}
2.4 请求响应拦截处理
interceptors ( instance, url ) {
let isNoSpin = proStorage. fetch ( 'noSpin' ) ;
isNoSpin && proStorage. save ( 'noSpin' , 'false' ) ;
}
instance. interceptors. request. use (
config => {
this . removeAlikeUrl ( config) ;
let cancelTrigger = config. cancelTrigger;
if ( ! config. cancelTrigger) {
config. cancelToken = new this. CancelToken ( c => {
cancelTrigger = c;
} ) ;
}
this . alikeUrl. push ( { u : config. url + '&' + config. method, cancel : cancelTrigger } ) ;
this . triggerTime = new Date ( ) ;
if ( ! Object. keys ( this . queue) . length && ( ! isNoSpin || isNoSpin === 'false' ) ) {
store. commit ( 'appLoading/display' , true ) ;
}
if ( ! isNoSpin || isNoSpin === 'false' ) {
this . queue[ url] = true ;
}
isNoSpin = null ;
return config;
} ,
error => {
return Promise. reject ( error) ;
}
) ;
instance. interceptors. response. use (
res => {
this . removeAlikeUrl ( res. config) ;
this . destroy ( url) ;
const { data, status } = res;
const {
config : { method }
} = JSON . parse ( JSON . stringify ( res) ) ;
if (
store. state. interfaceLog. storageLog. developmentOff &&
url. indexOf ( 'analysis/api/' ) !== - 1 &&
method === 'post' &&
data. code === 1
) {
let query_key, query_name, query_time, exec_time;
if ( data. data && Object. keys ( data. data) . length > 0 ) {
query_key = data. data[ 'query_key' ] ;
query_name = data. data[ 'query_name' ] ;
query_time = data. data[ 'query_time' ] ;
exec_time = data. data[ 'exec_time' ] ;
} else if ( data. os_data && data. os_data[ 0 ] && Object. keys ( data. os_data[ 0 ] ) . length > 0 ) {
query_key = data. os_data[ 0 ] . data[ 'query_key' ] ;
query_name = data. os_data[ 0 ] . data[ 'query_name' ] ;
query_time = data. os_data[ 0 ] . data[ 'query_time' ] ;
exec_time = data. os_data[ 0 ] . data[ 'exec_time' ] ;
}
const logData = {
url,
query_key,
query_name,
query_time,
exec_time,
title : router. currentRoute. meta. title,
param : res. config. data,
triggerTime : this . triggerTime,
msg : data. msg
} ;
store. commit ( 'addStorageLog' , logData) ;
}
interceptResponse ( data. code) ;
return { data, status } ;
} ,
error => {
this . destroy ( url) ;
console. error ( 'response: ' , typeof error === 'object' ? error. message : error) ;
if ( ! axios. isCancel ( error) ) {
this . removeAlikeUrl ( error. config) ;
let errorInfo = error. response;
if ( ! errorInfo) {
const {
request : { statusText, status } ,
config
} = error;
errorInfo = {
statusText,
status,
request : { responseURL : config. url }
} ;
}
interceptResponse ( errorInfo. status) ;
}
return Promise. reject ( error) ;
}
) ;
2.5 类外方法
function interceptResponse ( status ) {
if ( status === 401 && router. currentRoute. name !== 'Login' ) {
Modal. warning ( {
title : '提示' ,
content : 'Session已过期!请您确认返回登录页面重新登录!' ,
onOk : ( ) => {
store. commit ( 'user/logout' ) ;
}
} )
}
}
function checkIsUsePort2 ( url, basePort ) {
return ( basePort === 9001 || basePort >= 30000 ) && / ^\/(analysis|query)[^/]*\/ / . test ( url) ;
}
function getUrlPort ( url ) {
let result = url. match ( / \/\/.*:(\d+) / ) ;
return result && Number ( result[ 1 ] ) ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)