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,
});