【鸿蒙开发保姆级教程】-HarmonyOS NEXT请求库封装

前言

华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。随着鸿蒙的不断发展以及国家的大力支持,未来鸿蒙职位肯定会迎来一个大的爆发。俗话说,万事开头难,新的版本对开发者设置了更多的障碍。之前的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
### 鸿蒙系统中 Axios 网络请求封装示例 在鸿蒙系统中,`@ohos/axios` 是用于发起 HTTP 请求的一个。通过对其进行封装,可以简化网络请求流程并增强可维护性和扩展性。 #### 1. 创建网络请求类 为了更好地管理请求配置和拦截器逻辑,可以通过创建一个专门的类来封装 `axios` 的功能: ```typescript // 文件名: HttpRequest.ts import axios from '@ohos/axios'; class HttpRequest { private baseURL: string; private timeout: number; constructor(config: { baseURL: string, timeout?: number }) { this.baseURL = config.baseURL || ''; this.timeout = config.timeout || 10000; // 默认超时时间设为10秒 } public request<T>(options: { url: string, method: 'get'|'post', data?: any }): Promise<T> { const instance = axios.create({ baseURL: this.baseURL, timeout: this.timeout }); // 添加请求拦截器 instance.interceptors.request.use((config) => { console.log('Request Config:', config); return config; }, (error) => { console.error('Request Error:', error); return Promise.reject(error); }); // 添加响应拦截器 instance.interceptors.response.use((response) => { console.log('Response Data:', response.data); return response.data; }, (error) => { console.error('Response Error:', error); return Promise.reject(error); }); return instance(options.method, options.url, options.data).then((data) => data as T); } } export default HttpRequest; ``` 此部分实现了基本的请求与响应拦截器,并允许自定义基础 URL 和超时设置[^1]。 --- #### 2. 定义接口函数 接下来,在 API 层面定义具体的业务接口调用方法。这些方法会利用上述封装好的 `HttpRequest` 类完成实际的数据交互。 ```typescript // 文件名: api/user.ts import HttpRequest from '../utils/HttpRequest'; const httpRequest = new HttpRequest({ baseURL: 'https://example.com/api/' }); interface UserInfoParams { page: number; pagelimit: number; } export async function fetchUserInfo(params: UserInfoParams): Promise<any> { try { const result = await httpRequest.request({ url: '/user/info', method: 'post', data: params }); return result; } catch (e) { throw e; } } ``` 这里展示了如何使用封装后的 `HttpRequest` 来发送 POST 请求获取用户信息[^3]。 --- #### 3. 使用封装的方法 最后,在具体的应用场景中可以直接调用封装好的接口函数,而无需关心底层细节。 ```typescript // 调用示例 fetchUserInfo({ page: 1, pagelimit: 10 }) .then((userInfo) => { console.log('User Info:', userInfo); }) .catch((error) => { console.error('Error fetching user info:', error); }); ``` 这种设计模式不仅提高了代码复用率,还便于后续统一处理错误、日志记录等功能需求[^2]。 --- ### 注意事项 - **安全性**:对于敏感数据(如 Token),应在请求头或参数中动态注入。 - **兼容性**:确保目标设备支持所使用的 HarmonyOS 版本及其特性。 - **性能优化**:合理调整超时时间和并发控制策略以适应不同网络环境。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值