Harmony HTTP GET POST请求封装

37 阅读1分钟

一、开启网络权限#

image.png

二、网络请求的封装

1.首先设置一个基地址(请求url通常由协议、域名、资源路径组成),由于大多数接口基地址一样只需要拼接就可以组成完整的接口地址

const baseUrl = 'https://api-harmony-teach.net/'

2.Post请求的封装

// 1.统一封装post请求方法
static async post<T>(url: string, extraData?: Object) {
  try {
    // 2. 创建http请求对象
    const httpReq = http.createHttp()
    // 3. 配置请求参数
    let options: http.HttpRequestOptions = {
      method: http.RequestMethod.POST,
      header: {
        "Content-Type": "application/json"
      },
      expectDataType: http.HttpDataType.OBJECT
    }

    // 1. 判断extraData可选参数如果不为空,则要将其追加到options对象中
    if (extraData) {
      options.extraData = extraData
    }

    // 2. 从AppStorage('user')中获取数据token,如果有值则追加到options.header中的Authorization
    let user = AppStorage.get('user') as iLoginDataModel
    // 使用user?写法,就能规避bug:在undefined上点出token这个属性报错
    let token = user?.token
    if (token && options.header) {
      options.header['Authorization'] = `Bearer ${token}`
    }

    // 3. 将动态构建好的options参数和url传给request->发请求获取服务器的响应数据
    url = baseUrl + url // 将用户传入的路径与基本地址拼接成一个完整的url地址,将来java后端发布接口的baseurl改变,我们只需要改变baseurl
    let res = await httpReq.request(url, options)

    // 增加服务器响应的code如果为401表示token失效,则重新登录获取新的有效token
    let resdata = res.result as iResponseModel<T>

    if (resdata.code !== 10000) {
      if (resdata.code === 401) {
        // promptAction.showToast({ message: resdata.code.toString() })
        //   token失效,重新登录
        promptAction.showToast({ message: 'token失效,请重新登录' })
        router.replaceUrl({ url: 'pages/LoginPage' })
      } else {
        promptAction.showToast({ message: resdata.message })
      }
    }

    //   4. 将服务器的数据返回
    return resdata
  } catch (err) {
    promptAction.showToast({ message: '网络请求错误' })
    return Promise.reject(err)
  }
}

3.Get请求的封装

// 2. 统一封装get请求方法
  static async get<T>(url: string) {
    try {
      // 1. 创建http请求对象
      const httpReq = http.createHttp()
      let user = AppStorage.get('user') as iLoginDataModel
      // 2. 配置请求参数
      let options: http.HttpRequestOptions = {
        method: http.RequestMethod.GET,
        header:{
          "Authorization": `Bearer ${user.token}`
        },
        expectDataType: http.HttpDataType.OBJECT
      }
      let token = user?.token
      if (token && options.header) {
        options.header['Authorization'] = `Bearer ${token}`
      }
      url = baseUrl + url
      let res = await httpReq.request(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)
    }
  }