共计 1946 个字符,预计需要花费 5 分钟才能阅读完成。
为什么需要封装 HTTP 客户端?
在日常开发中,我们经常遇到这样的场景:

- 每个请求都需要手动添加 Authorization 头
- 响应数据需要重复进行 JSON 解析
- 错误处理分散在各处,无法统一管理
- 接口变更时需要修改多处代码
使用原生 http 模块或直接调用 axios 虽然能完成任务,但随着项目规模增长,这些问题会越来越明显。这就是我们需要封装 HTTP 客户端的原因。
Trae vs Axios: 为什么选择 Trae?
Trae 和 Axios 都是优秀的 HTTP 客户端库,但 Trae 有几个独特优势:
- 更灵活的中间件系统 – Trae 的 middleware 机制允许更细粒度的控制
- 更好的可组合性 – 可以轻松创建多个实例并复用配置
- TypeScript 友好 – 类型推断更精确
基础封装步骤
1. 安装与初始化
首先安装 Trae:
npm install trae
然后创建基础实例:
import trae from 'trae';
const api = trae.create({
baseUrl: 'https://api.example.com',
headers: {'Content-Type': 'application/json',}
});
2. 添加拦截器
请求拦截器示例(处理 JWT):
api.before((request) => {const token = localStorage.getItem('token');
if (token) {request.headers.Authorization = `Bearer ${token}`;
}
return request;
});
api.after((response) => {
// 统一处理响应数据
return response.data;
});
3. 错误处理
分层错误处理策略:
api.after((response) => {if (response.status >= 400) {
// 业务错误
throw new BusinessError(response.data.message);
}
return response;
}, (error) => {
// 网络错误
if (error.message === 'Network Error') {throw new NetworkError();
}
throw error;
});
完整 TypeScript 实现
import trae, {TraeInstance} from 'trae';
type ApiResponse<T> = {
data: T;
code: number;
message?: string;
};
class ApiClient {
private instance: TraeInstance;
constructor(baseURL: string) {this.instance = trae.create({ baseURL});
this.setupInterceptors();}
private setupInterceptors() {
// 请求拦截器
this.instance.before((config) => {
// 添加认证头
const token = this.getToken();
if (token) {config.headers.Authorization = `Bearer ${token}`;
}
return config;
});
// 响应拦截器
this.instance.after((response) => {
// 成功响应处理
return response.data;
},
(error) => {
// 错误处理
if (error.response?.status === 401) {this.handleUnauthorized();
}
return Promise.reject(error);
}
);
}
public async get<T>(url: string): Promise<ApiResponse<T>> {return this.instance.get(url);
}
// 其他 HTTP 方法实现...
}
性能优化建议
- 连接池配置
- 根据服务器性能调整 maxSockets
-
生产环境建议 50-100
-
超时策略
- 普通请求: 5-10 秒
-
文件上传: 30-60 秒
-
内存泄漏防范
- 定期清理未完成的请求
- 使用 AbortController 取消长时间未响应的请求
生产环境注意事项
- 敏感信息过滤
- 日志中自动脱敏敏感头信息
-
使用 Proxy 包装敏感数据
-
分布式追踪
- 为每个请求添加唯一 ID
-
通过拦截器注入 X -Request-ID
-
熔断降级
- 实现 Circuit Breaker 模式
- 错误率达到阈值时自动降级
思考题
- 如何实现请求优先级调度?
- 在多租户系统中,如何优雅处理不同的认证方案?
- 对于大文件上传,如何优化内存使用?
通过以上步骤,我们构建了一个健壮、可维护的 HTTP 客户端。在实际项目中,可以根据需求继续扩展功能,如请求缓存、自动重试等。
正文完
发表至: 编程开发
近三天内
