mirror of
https://github.com/router-for-me/Cli-Proxy-API-Management-Center.git
synced 2026-02-19 03:00:49 +08:00
refactor(api): centralize url normalization
This commit is contained in:
@@ -7,10 +7,10 @@ import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
|
|||||||
import type { ApiClientConfig, ApiError } from '@/types';
|
import type { ApiClientConfig, ApiError } from '@/types';
|
||||||
import {
|
import {
|
||||||
BUILD_DATE_HEADER_KEYS,
|
BUILD_DATE_HEADER_KEYS,
|
||||||
MANAGEMENT_API_PREFIX,
|
|
||||||
REQUEST_TIMEOUT_MS,
|
REQUEST_TIMEOUT_MS,
|
||||||
VERSION_HEADER_KEYS
|
VERSION_HEADER_KEYS
|
||||||
} from '@/utils/constants';
|
} from '@/utils/constants';
|
||||||
|
import { computeApiUrl } from '@/utils/connection';
|
||||||
|
|
||||||
class ApiClient {
|
class ApiClient {
|
||||||
private instance: AxiosInstance;
|
private instance: AxiosInstance;
|
||||||
@@ -32,7 +32,7 @@ class ApiClient {
|
|||||||
* 设置 API 配置
|
* 设置 API 配置
|
||||||
*/
|
*/
|
||||||
setConfig(config: ApiClientConfig): void {
|
setConfig(config: ApiClientConfig): void {
|
||||||
this.apiBase = this.normalizeApiBase(config.apiBase);
|
this.apiBase = computeApiUrl(config.apiBase);
|
||||||
this.managementKey = config.managementKey;
|
this.managementKey = config.managementKey;
|
||||||
|
|
||||||
if (config.timeout) {
|
if (config.timeout) {
|
||||||
@@ -42,26 +42,6 @@ class ApiClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 规范化 API Base URL
|
|
||||||
*/
|
|
||||||
private normalizeApiBase(base: string): string {
|
|
||||||
let normalized = base.trim();
|
|
||||||
|
|
||||||
// 移除尾部的 /v0/management
|
|
||||||
normalized = normalized.replace(/\/?v0\/management\/?$/i, '');
|
|
||||||
|
|
||||||
// 移除尾部斜杠
|
|
||||||
normalized = normalized.replace(/\/+$/, '');
|
|
||||||
|
|
||||||
// 添加协议
|
|
||||||
if (!/^https?:\/\//i.test(normalized)) {
|
|
||||||
normalized = `http://${normalized}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${normalized}${MANAGEMENT_API_PREFIX}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
private readHeader(
|
private readHeader(
|
||||||
headers: Record<string, unknown> | undefined,
|
headers: Record<string, unknown> | undefined,
|
||||||
keys: string[]
|
keys: string[]
|
||||||
|
|||||||
@@ -4,27 +4,17 @@
|
|||||||
|
|
||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import { normalizeModelList } from '@/utils/models';
|
import { normalizeModelList } from '@/utils/models';
|
||||||
|
import { normalizeApiBase } from '@/utils/connection';
|
||||||
import { apiCallApi, getApiCallErrorMessage } from './apiCall';
|
import { apiCallApi, getApiCallErrorMessage } from './apiCall';
|
||||||
|
|
||||||
const normalizeBaseUrl = (baseUrl: string): string => {
|
|
||||||
let normalized = String(baseUrl || '').trim();
|
|
||||||
if (!normalized) return '';
|
|
||||||
normalized = normalized.replace(/\/?v0\/management\/?$/i, '');
|
|
||||||
normalized = normalized.replace(/\/+$/g, '');
|
|
||||||
if (!/^https?:\/\//i.test(normalized)) {
|
|
||||||
normalized = `http://${normalized}`;
|
|
||||||
}
|
|
||||||
return normalized;
|
|
||||||
};
|
|
||||||
|
|
||||||
const buildModelsEndpoint = (baseUrl: string): string => {
|
const buildModelsEndpoint = (baseUrl: string): string => {
|
||||||
const normalized = normalizeBaseUrl(baseUrl);
|
const normalized = normalizeApiBase(baseUrl);
|
||||||
if (!normalized) return '';
|
if (!normalized) return '';
|
||||||
return `${normalized}/models`;
|
return `${normalized}/models`;
|
||||||
};
|
};
|
||||||
|
|
||||||
const buildV1ModelsEndpoint = (baseUrl: string): string => {
|
const buildV1ModelsEndpoint = (baseUrl: string): string => {
|
||||||
const normalized = normalizeBaseUrl(baseUrl);
|
const normalized = normalizeApiBase(baseUrl);
|
||||||
if (!normalized) return '';
|
if (!normalized) return '';
|
||||||
return `${normalized}/v1/models`;
|
return `${normalized}/v1/models`;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user