鸿蒙应用开发-http网络请求封装

1,811 阅读2分钟

在HarmonyOS中,网络请求时经常使用的。为了提高代码的复用性和可维护性同时避免屎山的存在,我们通常会对网络请求进行封装,以便在整个应用程序中统一管理请求和处理响应。今天我将分享一个基于鸿蒙应用开发 的网络请求封装方案(登录为案例),让代码更加优雅和高效。

1.封装思路

我们的封装方案主要包括两个静态方法:postget。这两个方法分别用于发送 POST 请求和 GET 请求,并在发送请求之前进行一系列的处理,包括添加请求头、处理 token、处理响应等。

2.基本配置

首先,我们需要定义一个基本的请求地址 baseUrl,它是所有请求的域名前缀。在这个示例中,我们使用了 https://api-harmony-teach.itheima.net/ 作为基本地址。

3.POST 请求封装

typescriptstatic async post<T>(url: string, extraData?: Object) {
  try {
    const req = http.createHttp()
    let options: http.HttpRequestOptions = {
      method: http.RequestMethod.POST,
      header: {
        'Content-Type': 'application/json',
      },
      expectDataType: http.HttpDataType.OBJECT
    }
​
    // 处理额外的数据
    if (extraData) {
      options.extraData = extraData
    }
​
    // 处理 token
    let user = AppStorage.get('user') as ILoginUsersModel
    let token = user?.token
    if (token && options.header) {
      options.header['Authorization'] = `Bearer ${token}`
    }
​
    // 发送请求获取服务器响应
    let res = await req.request(baseUrl + url, options)
    
    // 处理响应数据
    let resData = res.result as IResponseModel<T>
    if (resData.code !== 10000) {
      if (resData.code === 401) {
        // 处理 token 失效情况
        // 提示用户重新登录并跳转到登录页
        promptAction.showToast({ message: 'token失效,请重新登录' })
        router.replaceUrl({ url: 'pages/LoginPage' })
      } else {
        // 其他错误情况,显示错误信息
        promptAction.showToast({ message: resData.message })
      }
    }
    return resData
  } catch (err) {
    // 请求错误处理
    promptAction.showToast({ message: '请求网络错误' })
    return Promise.reject(err)
  }
}

4.GET 请求封装

typescriptstatic async get<T>(url: string) {
  try {
    const req = http.createHttp()
    let options: http.HttpRequestOptions = {
      header: {
        'Content-Type': 'application/json',
      },
      expectDataType: http.HttpDataType.OBJECT
    }
​
    // 处理 token
    let user = AppStorage.get('user') as ILoginUsersModel
    let token = user?.token
    if (token && options.header) {
      options.header['Authorization'] = `Bearer ${token}`
    }
​
    // 发送请求获取服务器响应
    let res = await req.request(baseUrl + url, options)
​
    // 处理响应数据
    let resData = res.result as IResponseModel<T>
    if (resData.code !== 10000) {
      if (resData.code === 401) {
        // 处理 token 失效情况
        // 提示用户重新登录并跳转到登录页
        promptAction.showToast({ message: 'token失效,请重新登录' })
        router.replaceUrl({ url: 'pages/LoginPage' })
      } else {
        // 其他错误情况,显示错误信息
        promptAction.showToast({ message: resData.message })
      }
    }
    return resData
  } catch (err) {
    // 请求错误处理
    promptAction.showToast({ message: 'get请求网络错误' })
    return Promise.reject(err)
  }
}

5.总结

通过以上封装,我们可以在项目中轻松使用 HdHttp.post()HdHttp.get() 方法来发送网络请求,并且可以统一处理请求头、token、以及处理响应的逻辑,使代码更加整洁和可维护。当然,根据实际情况,你还可以进一步完善这个封装方案,以满足项目的特定需求。