鸿蒙封装http网络请求

开发工具 Dev studio 5.0

import { http } from '@kit.NetworkKit'
import { ILoginUserData } from '../../models/LoginModel'
import { promptAction, router } from '@kit.ArkUI'
import { IResponseModel } from '../../models/IResponseModel'
import { Logger } from './LoggerUtils'

// 对网络请求的封装
//基础地址
const baseUrl = 'https://api-harmony-teach.itheima.net/'

export default class HttpMethod {
  // 封装post请求
  static async post<T>(url: string, extraData?: Object) {
    try {
      // 请求路径
      url = baseUrl + url
      // 请求参数
      let options: http.HttpRequestOptions = {
        // 请求方法
        method: http.RequestMethod.POST,
        // 请求头
        header: {
          "Content-Type": 'application/json',
        },
        // 返回数组自动转换为对象格式
        expectDataType: http.HttpDataType.OBJECT
      }
      // 判断参数extraData存不存在,存在则加入到option中
      if (extraData) {
        options.extraData = extraData
      }

      // 获取token
      let user = AppStorage.get('UserInfo') as ILoginUserData
      let token = user?.token
      if (token && options.header) {
        // 在option的请求头header中加入属性'Authorization'
        options.header['Authorization'] = `Bearer ${token}`
      }

      // 发起post请求
      let res = await http.createHttp().request(url, options)
      // 处理响应结果
      let result = res.result as IResponseModel<T>

      // 判断是否正常登录
      if (result.code !== 10000) {
        // 判断token是否失效
        if (result.code === 401) {
          promptAction.showToast({
            message: 'token失效,请重新登录'
          })
          router.replaceUrl({
            url: "pages/LoginPage"
          })
        }
        promptAction.showToast({
          message: `登录失败,失败原因${result.message}`
        })
      }
      // 返回result结果值
      return result
    } catch (e) {
      promptAction.showToast({
        message: `post请求错误,${e}`
      })
      return Promise.reject(e) //return错误值
    }
  }

  // 封装GET请求
  static async get<T>(url: string, extraData?: Object) {
    try {
      const httpReq = http.createHttp()
      //拼接域名和路径
      url = baseUrl + url
      let options: http.HttpRequestOptions = {
        method: http.RequestMethod.GET,
        header: {
          "Content-Type": 'application/json',
        },
        expectDataType: http.HttpDataType.OBJECT,
      }
      // 判断extraData存不存在,存在则加入到option中
      if (extraData) {
        options.extraData = extraData
      }

      let user = AppStorage.get('UserInfo') as ILoginUserData
      let token = user?.token
      if (token && options.header) {
        options.header["Authorization"] = `Bearer ${token}`
      }

      const res = await httpReq.request(url, options)
      const result = res.result as IResponseModel<T>

      //状态码不为10000的情况->失败
      if (result.code !== 10000) {
        if (result.code === 401) {
          promptAction.showToast({
            message: 'token失效,请重新登录'
          })
          router.replaceUrl({
            url: 'pages/LoginPage'
          })
        } else {
          promptAction.showToast({
            message: result.message
          })
        }
      }
      return result
    }
    catch (err) {
      promptAction.showToast({
        message: 'get请求错误'+err
      })
      return Promise.reject(err)
    }
  }
}

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值