http模块封装

概括:

POST/GET:

利用http模块结合泛型方法进行统一的post/get请求封装

技术细节

// 所有接口返回数据的类型
export interface IResponseModel<T> {
  /**
   * 请求成功10000标志
   */
  code: number;

  /**
   * 返回数据
   */
  data: T;

  /**
   * 请求成功
   */
  message: string;

  /**
   * 请求成功标志
   */
  success: boolean;

}

/**
 * 返回数据
 */
export interface iLoginDataModel {
  /**
   * 用户头像地址
   */
  avatar?: string;

  /**
   * 连续打卡天数
   */
  clockinNumbers: number;

  /**
   * 用户id
   */
  id: string;

  /**
   * 昵称
   */
  nickName: string;

  /**
   * token过期后,刷新token使用
   */
  refreshToken: string;

  /**
   * 分享加密串
   */
  shareInfo: string;

  /**
   * 后续交互使用的token
   */
  token: string;

  /**
   * 学习时长,单位s
   */
  totalTime: number;

  /**
   * 昵称
   */
  username?: string;

}

import { http } from '@kit.NetworkKit'
import { iLoginDataModel, iResponseModel } from '../../models/AccountModel'
import { promptAction, router } from '@kit.ArkUI'

const baseUrl: string = 'https://api-harmony-teach.itheima.net/hm/' // url的基地址

export class HdHttp {
  //   静态的 get泛型方法
  // get<t>('getclock')  带参数调用:get<t>('clockinInfo?year=2024&month=4')
  static async get<T>(url: string) {
    try {
      // 2.0 发请求
      const httpRequest = http.createHttp()

      url = baseUrl + url

      // 获取token
      // 获取token,判断如果有token,则传,否则不传
      let user = AppStorage.get('user') as iLoginDataModel
      let token = user?.token // 可选 【可空]类型

      let res = await httpRequest.request(url, {
        method: http.RequestMethod.GET,
        header: {
          'Authorization': `Bearer ${token}`
        },
        expectDataType: http.HttpDataType.OBJECT
      })

      //  响应
      // 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录
      let resData = res.result as iResponseModel<T>
      if(resData.code === 401){
        promptAction.showToast({ message: '登录超时,请重新登录' })
        router.pushUrl({url:'pages/LoginPage'})
      }
      return resData
    } catch (err) {
      promptAction.showToast({ message: 'get网络错误' })
      return Promise.reject(err) // 如果报错则将错误返回
    }
  }


  //   静态的post泛型方法
  // url: 请求url地址
  // extraData:post请求体的参数,因为不是每个url都要求传递,所以定义为可选参数
  /* 封装思路:
      固定代码写死,可变的地方提炼成参数供外部调用的时候传入
   * */
  static async post<T>(url: string, extraData?: Object) {
    try {

      // 创建http对象
      const httpRequest = http.createHttp()

      // 完整拼接url地址
      url = baseUrl + url

      // 设置请求参数
      let options: http.HttpRequestOptions = {
        method: http.RequestMethod.POST,
        header: {
          "Content-Type": 'application/json'
        },
        expectDataType: http.HttpDataType.OBJECT   // http模块底层将服务器响应回来的json字符串自动调用JSON.parse转成对象
      }
      // 判断如果extraData有值,则向options对象增加一个extraData的属性
      if (extraData) {
        options.extraData = extraData
      }
      // 获取token,判断如果有token,则传,否则不传
      let user = AppStorage.get('user') as iLoginDataModel
      let token = user?.token // 可选 【可空]类型
      if (token && options.header) {
        options.header['Authorization'] = `Bearer ${token}`
      }
      // 调用reqeust方法并且指定相应的参数
      let res = await httpRequest.request(url, options)

      //  响应服务器的数据
      //  由于不同的接口返回的数据类型不一样,所以此方法应该用一个泛型来替代,将来实际运行的时候是什么类型就返回什么类型
      // 判断如果响应code为401则提示用户token失效,直接跳转到登录页面让用户重新登录
      let resData = res.result as iResponseModel<T>
      if(resData.code === 401){
        promptAction.showToast({ message: '登录超时,请重新登录' })
        router.pushUrl({url:'pages/LoginPage'})
      }
      return resData
    } catch (err) {
      promptAction.showToast({ message: 'post网络错误' })
      return Promise.reject(err) // 如果报错则将错误返回
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值