前言
华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。随着鸿蒙的不断发展以及国家的大力支持,未来鸿蒙职位肯定会迎来一个大的爆发。俗话说,万事开头难,新的版本对开发者设置了更多的障碍。之前的FA模型已经彻底被抛弃(前端转向鸿蒙的难度骤增)。取而代之的是主打Flutter开发体验的Stage模型。对于熟悉Flutter的开发者来说,这无疑是个好消息,但对于擅长TS开发的人来说,这却成了一个不小的挑战——以往的优雅方式突然变得更艰难。API10以上的版本,所有的语法错误都将导致编译失败!
基于新的模式,新的架构,我们来做一个简单的请求库吧。顺便吐槽一下,各种开源编辑器不用,用这么垃圾的IDE,各种不好使。
起手:创建文件
新建一个专门存放工具类或者类似的目录,我们把请求库文件放在里面common/request.ets。简单写一个请求库的开头,我们设计在具体得使用中需要重新new一个请求对象,也可以把下面得导出改成直接导出单例对象。
import http from '@ohos.net.http';
export default class HttpRequest{}
一个简单的请求库就好了,全文完!
封装核心请求函数
在我们的核心请求库中,封装了专属的请求方法。我们的设计理念是让请求方法能够有效处理网络异常和自定义异常参数,这些异常处理需要根据不同公司的定义采用不同的处理逻辑。为了确保类型检测的严谨性,我们将参数处理放在了具体的请求方法中。
假设参数已经处理完毕,请求方法支持额外设置基础URL,并默认返回JSON格式的响应。错误情况将通过固定的code字段进行判定,超时时间设定为10秒。
这种设计不仅提高了灵活性和兼容性,也确保了请求的稳定性和准确性。
/**
* 基础请求库
* @param method
* @param url
* @param data
*/
private async _request(method: http.RequestMethod, url: string, data?: string):Promise<T|null|undefined> {
let httpRequest = http.createHttp();
const res = await httpRequest.request(this.baseUrl+url, {
method,
header: {
'Content-Type': 'application/json'
},
extraData:data,
expectDataType: http.HttpDataType.OBJECT,
connectTimeout: 10000,
readTimeout: 10000,
})
httpRequest.destroy();
if(res.responseCode!==200)throw new Error("网络链接失败")
const res_data=res.result as IResponseData<T>
if(res_data.code!==1)throw new Error(res_data.msg)
return res_data.data
}
这里需要注意得是,新得代码要求所有对象都有明确得类型。所以我们还需要把几个类型补充一下。
// 返回得基础对象
interface IResponseData<T>{
code:number;
msg:string;
data:null|undefined|T;
}
baseUrl = ''
constructor(opts?: IOpts) {
if (opts?.baseUrl) {
this.baseUrl = opts.baseUrl
}
}
处理GET请求
GET请求使用还是比较频繁得(正常公司至少区分GET和POST,部分公司只有POST),我们区分几种情况来做几个应对不同情况得方法。
无参数情况
在没有参数情况下,GET请求相对简单,只需要调用上面做得核心方法就好了。或者参数设计中作为上层API层去处理,参数已经合并到URL中了
// 简易无参数版本
get<T>(url:string){
return this._request<T>(http.RequestMethod.GET,url)
}
// 使用例子
const axios = new request();
async function testGet(a: string, b: num