Http
支持 GET/POST、自定义编解码、任意返回类型解析的网络请求框架
介绍#
mk.network.http 是支持 Web 和原生环境的 Http 封装对象,扩展了编解码,自动解析返回数据,
且以 Promise 方式实现
方法#
get / post#
基础用法#
// GET 请求
const response = await mk.network.http.get('https://api.example.com/data', {
returnType: 'json',
timeoutNum: 10000,
});
// POST 请求
const response = await mk.network.http.post('https://api.example.com/login', {
body: JSON.stringify({ username: 'user', password: 'pass' }),
header: { 'Content-Type': 'application/json' },
returnType: 'json',
});
返回值#
- 成功时返回
Promise<any>(解析后的响应数据) - 失败时返回
Promise<null>(超时、网络错误、状态码异常)
Http_.Config 配置类#
| 属性 | 类型 | 默认值 | 描述 |
|---|---|---|---|
timeoutNum | number | 5000 | 超时时间(毫秒) |
returnType | XMLHttpRequestResponseType | - | 返回数据类型(如 'json'、'arraybuffer') |
codec | mk.CodecBase | - | 编解码器(可选) |
body | Document | Blob | BufferSource | FormData | URLSearchParams | string | - | 请求体 |
header | Record<string, string> | - | 请求头 |
openCallbackFunc | (http: XMLHttpRequest) => void | - | 请求初始化回调 |
配置示例#
const config = new mk.network.Http_.Config({
timeoutNum: 10000,
returnType: 'arraybuffer', // 接收二进制数据
header: {
'Content-Type': 'application/json',
Authorization: 'Bearer token123',
},
codec: new MyCodec(), // 自定义编解码器
});
返回类型处理逻辑#
returnType | 响应处理 | 适用场景 |
|---|---|---|
text / "" | 直接返回 xmlHttp.response | 文本、HTML |
arraybuffer | 转换为 data:image/png;base64,... | 图片、二进制数据 |
blob | 通过 FileReader 转换为 Data URL | 文件、图片 |
document | 返回 Document 或 XMLDocument | XML、HTML 文档 |
json | 自动解析为 JavaScript 对象 | JSON API |
请求头(header)#
支持自定义请求头,例如:
header: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123',
'X-Custom-Header': 'value',
}
注意:在原生环境(
sys.isNative)下,框架自动添加Accept-Encoding: gzip,deflate。
请求初始化回调(openCallbackFunc)#
在 XMLHttpRequest.open 后触发,可用于注册事件或设置额外属性。
示例#
openCallbackFunc: (http) => {
http.onprogress = (e) => console.log('下载进度:', e.loaded / e.total);
http.ontimeout = () => console.log('请求超时');
};
高级功能#
超时处理#
- 默认超时 5000ms
- 通过
timeoutNum自定义超时 - 在
openCallbackFunc中注册ontimeout处理超时事件
二进制数据支持#
通过 returnType: 'arraybuffer' 接收二进制数据,框架自动转换为 Base64 Data URL。
适用场景:
- 图片加载
- 音频/视频文件
- 自定义二进制协议
跨域支持#
- 浏览器:遵循同源策略,需服务器支持 CORS
- 原生环境:无跨域限制
错误处理策略#
| 错误类型 | 处理方式 |
|---|---|
| 网络错误 | 返回 null |
| 状态码错误 | 仅处理 200-399 的状态码,其他状态码返回 null |
| 超时 | 返回 null,并在 openCallbackFunc 中触发 ontimeout |
最佳实践#
配置复用#
创建全局配置,避免重复代码:
const defaultConfig = new mk.network.Http_.Config({
timeoutNum: 10000,
header: {
'Content-Type': 'application/json',
Authorization: 'Bearer token123',
},
});
// 使用
const response = await mk.network.http.get('https://api.example.com/data', defaultConfig);
错误重试机制#
通过 Promise.race 实现超时重试:
async function requestWithRetry(url: string, config: Http_.Config, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await mk.network.http.get(url, config);
if (response) return response;
}
return null;
}
资源释放#
- 二进制数据:通过
arraybuffer或blob接收后,及时释放内存 - 请求中断:通过
XMLHttpRequest.abort()中断请求
常见问题(FAQ)#
Q: 如何发送 FormData 请求?
通过 body 传递 FormData 对象:
const formData = new FormData();
formData.append('file', file);
const response = await mk.network.http.post('https://api.example.com/upload', {
body: formData,
});