鸿蒙应用中的axios封装【TS版】

1、安装 axios

ohpm install @ohos/axios

1、AxiosInstance.ets

创建 axios 实列,设置请求响应拦截器

import { promptAction } from '@kit.ArkUI'
import axios, { AxiosError, AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios'
import { Log } from '../utils/Log'

const TAG = 'AxiosInstance'

// 开发测试环境
// const BASEURL = 'https://teacher365.com/sit'
// 生产环境
const BASEURL = 'https://teacher365.com/prod'

let axiosInstance: AxiosInstance = axios.create({
  baseURL: BASEURL,
  timeout: 5000, //请求超时的时间
  headers: {
    // 前端允许接受的数据类型
    Accept: "application/json",
    // 前端后端发送的数据类型
    'Content-Type': 'application/json;charset=UTF-8'
  }
})


// axios实例请求拦截
axiosInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  Log.showInfo(TAG, 'AxiosRequest = %{public}s', JSON.stringify(config))
  const token = AppStorage.get<string>('app_token')
  token && (config.headers['Authorization'] = `Bearer ${token}`)
  return config
}, (error: AxiosError) => {
  return Promise.reject(error)
})

// axios实例拦截响应
axiosInstance.interceptors.response.use((response: AxiosResponse) => {
  Log.showInfo(TAG, 'AxiosRequest = %{public}s', JSON.stringify(response))
  // 拦截响应,判断是否有token,如果有,就将token存入本地
  if (response.status === 200) {
    return response.data
  } else {
    Log.showInfo(TAG, 'AxiosResponse Fail = %{public}s', JSON.stringify(response))
    return Promise.reject(response.statusText)
  }
}, (error: AxiosError) => {
  Log.showInfo(TAG, 'AxiosResponse Error = %{public}s', JSON.stringify(error))
  promptAction.showToast({
    message: error.message
  })
  return Promise.reject(error.message)
})

export default axiosInstance

2、Request.ets

统一封装 post、get 请求

import axiosInstance from "./AxiosInstance"

// 服务端返回的数据格式,类型约定好
interface DataRes<T> {
  code: number
  message: string
  data: T
}

export default class Request {

  static post<T>(url: string, param: Record<string, Object>): Promise<T> {
    return new Promise((resolve, rejected) => {
      axiosInstance.post(url, param).then((res: Object) => {
        const data = res as DataRes<T>
        if (data && data.code === 200) {
          resolve(data.data)
        } else {
          rejected(data.message)
        }
      }).catch((message: string) => {
        rejected(message)
      })
    })
  }

  static get<T>(url: string, param: Record<string, Object>): Promise<T> {
    return new Promise((resolve, rejected) => {
      axiosInstance.get(url, {
        params: param
      }).then((res: Object) => {
        const data = res as DataRes<T>
        if (data && data.code === 200) {
          resolve(data.data)
        } else {
          rejected(data.message)
        }
      }).catch((message: string) => {
        rejected(message)
      })
    })
  }

}

3、TicketApi.ets

import Request from '../common/http/Request'

export interface Ticket {
  id: number
  ticketName: string
  price: number
  ticketNotice: string
  ticketType: string
  ticketStatus: number
}

export function getAllTickets(param: Record<string, Object>) {
  return Request.post<Ticket[]>('api/ticket/list', param)
}

export function getTicketDetail(param: Record<string, Object>) {
  return Request.post<Ticket>('api/ticket/detail', param)
}

4、业务层调用

import { getAllTickets, Ticket} from '../api/TicketApi'

const TAG: string = 'TicketList'

@Entry
@Component
struct TicketList {
  @State data: Ticket[] = []

  aboutToAppear(): void {
    let param: Record<string, Object> = {}
    param['appId'] = 'xxxxxxxx'
    getAllTickets(param).then((res) => {
      this.data = res
    })
  }
  ...
}
### HarmonyOSAxios 封装示例 #### 一、项目初始化与依赖安装 为了在 HarmonyOS 应用程序中使用 `@ohos/axios` 实现网络请求功能,首先需要确保已经正确引入该库。通过命令行工具进入目标 module 文件夹并执行如下指令完成安装: ```bash ohpm install @ohos/axios ``` 此操作会自动下载所需包及其依赖项至工程内[^3]。 #### 二、创建 ETS 请求封装类 接下来定义一个新的 JavaScript (ETS) 文件用于构建通用的 HTTP 客户端接口。这里采用静态泛型函数的方式实现 GET 和 POST 方法的支持,方便后续调用者传入不同的数据结构而无需关心内部细节变化。 ```typescript // request.ts import axios from '@ohos/axios'; class HttpClient { private static instance: HttpClient; public static getInstance(): HttpClient { if (!HttpClient.instance) { HttpClient.instance = new HttpClient(); } return HttpClient.instance; } /** * 发起HTTP请求 */ async request<T>(config: any): Promise<T> { try { const response = await axios(config); return response.data as T; // 返回的数据会被转换为目标类型T } catch (error) { console.error('Request failed:', error.message || '未知错误'); throw error; } } } export default HttpClient.getInstance(); // 使用方式举例 const client = HttpClient.getInstance(); client.request<{ id: number, name: string }> ({ url: '/api/user', method: 'GET' }).then((res) => { console.log(res.id); // 访问具体字段 }); ``` 上述代码片段展示了如何基于 Axios 构建一个简单的单例模式客户端实例,并提供了带有泛型支持的基础请求方法 `request()` 。这使得开发者可以在发起请求时指定预期接收的结果对象模型,从而获得更好的类型安全性和开发体验[^2]。 #### 三、全局配置与增强特性集成 除了基本的功能外,在实际应用场景下还应考虑加入更多实用性的设计来提升整体性能表现以及用户体验感。例如设置默认的基础 URL 地址、调整连接超时时长或是添加自定义 Header 字段等;另外也可以借助于 Axios 提供的强大插件机制——即所谓的“拦截器”,分别针对每一次发送出去之前以及接收到服务器回复之后两个阶段做进一步加工处理。 ```javascript // 继续完善之前的 HttpClient 类... constructor() { this.initInterceptors(); // 初始化拦截器链路 } private initInterceptors() { axios.interceptors.request.use( config => { // 可在此处附加公共参数或鉴权令牌等内容 config.headers['Authorization'] = localStorage.getItem('token') ?? ''; return config; }, error => Promise.reject(error) ); axios.interceptors.response.use( res => res, err => { if (err?.response?.status === 401) { // 当遇到未授权状态码时尝试刷新Token或其他措施 // Handle unauthorized access here. } return Promise.reject(err); } ); } ``` 以上部分实现了较为完善的预处理器和后置处理器逻辑,能够有效帮助应用程序更好地应对复杂的业务需求场景下的异常状况管理问题[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值