鸿蒙实战开发:网络层的艺术——优雅封装与搭建指南(上)
在鸿蒙的广袤开发世界中,网络层作为信息交换的桥梁,其重要性不言而喻。今天,我将带领大家一同探索如何以艺术般的手法,优雅地封装鸿蒙官方的网络库,为我们的应用搭建一个高效、灵活的网络层。我们在下一篇章中,将深入阐述如何利用这一封装完善的网络库,轻松驾驭网络层的开发与使用。
一、封装目的:可拓展与可拦截
在鸿蒙应用开发中,网络请求的封装不仅是为了简化开发流程,更是为了提高代码的复用性和可维护性。我们的封装目标主要围绕以下两点:
- 可拓展性:允许开发者根据业务需求,轻松扩展网络请求的功能,如添加自定义请求头、设置请求超时时间等。
- 可拦截性:提供网络请求的拦截机制,使得我们可以在请求发送前或响应返回后进行一系列操作,如添加日志记录、错误处理等。
二、定义基础元素:错误常量与字符串
1. 错误常量定义
为了统一管理网络请求中的错误码,我们定义了一个NetworkServiceErrorConst
类,用于存储各种网络请求可能遇到的错误码:
export class NetworkServiceErrorConst {
// 网络不可用
static readonly UN_AVAILABLE: number = 100000;
// URL错误
static readonly URL_ERROR: number = 100001;
// URL不存在错误
static readonly URL_NOT_EXIST_ERROR: number = 100002;
// 网络错误
static readonly NET_ERROR: number = 100003;
// ...其他可能的错误码
}
2. 错误字符串定义
同时,我们还需要定义与错误码对应的错误字符串,以便在应用中展示给用户:
{
"name": "network_unavailable",
"value": "网络不可用"
},
{
"name": "invalid_url_format",
"value": "URL格式不合法"
},
{
"name": "invalid_url_not_exist",
"value": "URL不存在"
}
三、实用工具集
URL 校验
为了确保网络请求中的URL格式正确,我们提供了一个isValidUrl
函数,它使用正则表达式来验证URL的有效性。
private isValidUrl(url: string): boolean {
// 正则表达式匹配各种可能的URL格式
const urlPattern = new RegExp(
'^(https?:\/\/)?' + // 协议
'((([a-z\d]([a-z\d-]*[a-z\d])*)\.)+[a-z]{2,}|' + // 域名
'((\d{1,3}\.){3}\d{1,3}))' + // 或IPv4地址
'(\:\d+)?(\/[-a-z\d%_.~+]*)*' + // 端口和路径
'(\?[;&a-z\d%_.~+=-]*)?' + // 查询字符串
'(\#[-a-z\d_]*)?$', // 片段定位符
'i' // 忽略大小写
);
return urlPattern.test(url); // 返回验证结果
}
// 使用示例
if (isValidUrl("http://example.com")) {
console.log("URL is valid.");
} else {
console.log("URL is invalid.");
}
参数拼接
当需要在URL中附加查询参数时,appendQueryParams
函数可以帮助我们轻松实现。它支持处理单个值或数组值的参数,并自动处理编码。
private appendQueryParams(url: string, queryParams: Map<string, any> | undefined): string {
if (!queryParams || queryParams.size === 0) {
return url;
}
const paramsArray: string[] = [];
queryParams.forEach((value, key) => {
if (Array.isArray(value)) {
for (let i = 0; i < value.length; i++) {
paramsArray.push(`${
encodeURIComponent(`${
key}[${
i}]`)}=${