版本: 1.0.0 创建日期: 2025-09-28 目标: 定义统一HTTP客户端的核心接口规范
统一HTTP客户端的主接口,支持多平台账户的HTTP API调用。
interface IUniversalHttpClient {
/**
* 执行HTTP请求
* @param request 请求配置
* @returns 响应数据
*/
request<T = any>(request: HttpClientRequest): Promise<HttpClientResponse<T>>;
/**
* 批量执行HTTP请求
* @param requests 请求配置数组
* @returns 响应数据数组
*/
batchRequest<T = any>(requests: HttpClientRequest[]): Promise<HttpClientResponse<T>[]>;
/**
* 注册新平台适配器
* @param platform 平台名称
* @param adapter 平台适配器实例
*/
registerPlatform(platform: string, adapter: IPlatformAdapter): void;
/**
* 获取客户端健康状态
* @returns 健康状态信息
*/
getHealth(): Promise<HealthStatus>;
/**
* 关闭客户端,释放资源
*/
close(): Promise<void>;
}
HTTP请求配置接口。
interface HttpClientRequest {
/** 目标交易平台 */
platform: string;
/** 账户标识符 */
accountId: string;
/** 请求方法 */
method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
/** 请求URL(相对路径) */
url: string;
/** 请求头 */
headers?: Record<string, string>;
/** 请求体 */
body?: any;
/** 请求选项 */
options?: RequestOptions;
}
请求选项配置接口。
interface RequestOptions {
/** 超时配置 */
timeout?: TimeoutConfig;
/** 重试配置 */
retry?: RetryConfig;
/** 代理控制 */
proxy?: ProxyControlOptions;
/** 是否记录敏感数据 */
logSensitiveData?: boolean;
/** 幂等标识符 */
idempotencyKey?: string;
}
超时配置接口。
interface TimeoutConfig {
/** 连接超时(毫秒) */
connect?: number; // 默认5000
/** 读取超时(毫秒) */
read?: number; // 默认30000
/** 写入超时(毫秒) */
write?: number; // 默认15000
}
重试配置接口。
interface RetryConfig {
/** 最大重试次数 */
maxAttempts?: number; // 默认3
/** 重试延迟(毫秒) */
delay?: number; // 默认1000
/** 是否使用指数退避 */
exponentialBackoff?: boolean; // 默认true
/** 重试条件判断 */
shouldRetry?: (error: HttpClientError) => boolean;
}
代理控制选项接口。
interface ProxyControlOptions {
/** 是否启用代理 */
enabled?: boolean;
/** 强制使用指定代理(覆盖全局和账户配置) */
forceProxy?: ProxyConfig;
/** 禁用代理(即使全局启用) */
disableProxy?: boolean;
/** 代理策略 */
strategy?: 'global' | 'account' | 'force' | 'disabled';
/** 代理轮换控制 */
rotation?: {
/** 是否启用轮换 */
enabled?: boolean;
/** 轮换间隔(请求数) */
interval?: number;
/** 轮换策略 */
strategy?: 'round-robin' | 'random' | 'least-used';
};
/** 代理健康检查 */
healthCheck?: {
/** 是否启用健康检查 */
enabled?: boolean;
/** 检查超时(毫秒) */
timeout?: number;
/** 失败阈值 */
failureThreshold?: number;
};
}
HTTP响应接口。
interface HttpClientResponse<T = any> {
/** 响应状态码 */
status: number;
/** 响应状态文本 */
statusText: string;
/** 是否成功 */
ok: boolean;
/** 响应数据 */
data: T;
/** 响应头 */
headers: Record<string, string>;
/** 请求元信息 */
metadata: ResponseMetadata;
}
响应元信息接口。
interface ResponseMetadata {
/** 请求ID */
requestId: string;
/** 执行时间(毫秒) */
duration: number;
/** 重试次数 */
retryCount: number;
/** 是否使用了代理 */
usedProxy: boolean;
/** 使用的代理URL */
proxyUsed?: string;
/** 时间戳 */
timestamp: Date;
/** 平台名称 */
platform: string;
}
健康状态接口。
interface HealthStatus {
/** 整体状态 */
status: 'healthy' | 'degraded' | 'unhealthy';
/** 各平台状态 */
platforms: Record<string, PlatformHealth>;
/** 性能指标 */
metrics: PerformanceMetrics;
}
平台健康状态接口。
interface PlatformHealth {
/** 平台状态 */
status: 'up' | 'down' | 'degraded';
/** 响应时间(毫秒) */
responseTime: number;
/** 成功率(百分比) */
successRate: number;
/** 最后检查时间 */
lastCheck: Date;
}
性能指标接口。
interface PerformanceMetrics {
/** 总请求数 */
totalRequests: number;
/** 成功请求数 */
successfulRequests: number;
/** 平均响应时间(毫秒) */
averageResponseTime: number;
/** 99分位响应时间(毫秒) */
p99ResponseTime: number;
/** 活跃连接数 */
activeConnections: number;
}
HTTP客户端错误基类。
class HttpClientError extends Error {
constructor(
message: string,
public readonly code: string,
public readonly details?: any
) {
super(message);
this.name = 'HttpClientError';
}
}
错误代码 | 描述 | 重试建议 |
---|---|---|
TIMEOUT |
请求超时 | 重试 |
NETWORK_ERROR |
网络错误 | 重试 |
AUTH_FAILED |
认证失败 | 不重试 |
RATE_LIMITED |
速率限制 | 延迟后重试 |
INVALID_REQUEST |
无效请求 | 不重试 |
SERVER_ERROR |
服务器错误 | 重试 |
PLATFORM_UNAVAILABLE |
平台不可用 | 重试 |
PLATFORM_NOT_FOUND |
平台未注册 | 不重试 |
PROXY_ERROR |
代理连接失败 | 重试或切换代理 |
增强的代理配置接口。
interface ProxyConfig {
/** 是否启用代理 */
enabled: boolean;
/** 代理URL */
url?: string;
/** 代理认证 */
auth?: {
username: string;
password: string;
};
/** 代理类型 */
type?: 'http' | 'https' | 'socks4' | 'socks5';
/** 会话配置 */
session?: {
prefix: string;
suffix: string;
rotation: boolean;
sticky?: boolean; // 会话是否粘性
};
/** 连接配置 */
connection?: {
/** 连接超时(毫秒) */
timeout?: number;
/** 保持连接 */
keepAlive?: boolean;
/** 最大空闲时间 */
maxIdleTime?: number;
};
/** 代理池配置 */
pool?: {
/** 代理服务器列表 */
servers: string[];
/** 负载均衡策略 */
strategy: 'round-robin' | 'random' | 'least-used' | 'fastest';
/** 健康检查URL */
healthCheckUrl?: string;
/** 健康检查间隔(毫秒) */
healthCheckInterval?: number;
};
/** 故障转移配置 */
failover?: {
/** 是否启用故障转移 */
enabled: boolean;
/** 最大重试次数 */
maxRetries: number;
/** 故障转移延迟(毫秒) */
delay: number;
/** 直连回退 */
fallbackToDirect?: boolean;
};
}
契约测试要求: 所有接口必须有对应的契约测试,测试必须先失败后通过。