首页 鸿蒙 正文
  • 本文约3418字,阅读需17分钟
  • 90
  • 0

鸿蒙第三方库中心仓---Axios

温馨提示:本文最后更新于2024年10月16日 08:19,若内容或图片失效,请在下方留言或联系博主。

Axios 是一个著名的基于 JavaScript 的开源库,用于浏览器和 Node.js 等环境中发送 HTTP 请求。它支持 Promise API,并且可以处理 XMLHttpRequests 和 Fetch API 背后的复杂性,为开发者提供了一种简洁易用的方式来实现 AJAX(Asynchronous JavaScript and XML)请求。

在HarmonyOS中,官方提供了@ohos/net.http 模块进行网络访问。它是官方提供的基础HTTP数据请求能力库,直接提供了对HTTP协议的底层支持,开发者可以通过这个模块发送GET、POST等HTTP请求,并处理响应结果。由于它是系统级别的API,其优点在于性能和兼容性得到保证,适用于基本的HTTP通信需求。

1. 下载安装第三方库(终端窗口执行):

ohpm install @ohos/axis

2. 在项目文件(module.json5)中配置网络权限:

"requestPermissions": [
      {
        "name": "ohos.permission.INTERNET"
      }
]

2. 实际应用:

 // 创建一个 axios 实例 内部做一些 axios 的通用配置
              const axiosInstance = axios.create({
                // axiosInstance 返回的还是 axios 只不过是带有基地址的axios
                baseURL: BASE_URL // 添加基地址
              })
              // axios.post<参数1,参数2,参数3> 泛型
              // 参数1: 没啥用 会被第二个参数覆盖
              // 参数2(重要): 用于指定后端返回数据的类型Axios提供的<参数内层返回数据(自定义的)<不同接口有一些数据可变的(用泛型需要什么参数 直接调用)>,null(没啥用)>
              // 参数3(重要): 服务器请求的参数
              const res =
                await axiosInstance.post<null, AxiosResponse<ServiceResponse<ServiceResponseResult>, null>, PostUserLoginPasswdData>('/user/login/passwd',
                  { passwd: '888itcast.CN764%...', phone: '120666666666' })
              AlertDialog.show({ message: JSON.stringify(res, null, 2) })

4. 最后可以将类型(参数2)进行抽取:

// type 类型别名 (类似变量声明的关键词 const let)
type AxiosResponseData<T> = AxiosResponse<ServiceResponse<T>, null>

最后在参数2 的位置调用 并传入响应的动态的类型

二 . 对象的方式 使用Axios

import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios'

// 实例化 通用配置
const httpInstance = axios.create({
  baseURL: 'https://meikou-api.itheima.net/', // 基地址
  timeout: 5000 // 响应最大时间
})

// 拦截器配置
// 请求拦截器
// token配置等
httpInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  return config
}, (error: AxiosError) => {
  return Promise.reject(error)
})

// 添加响应拦截器
// 错误统一处理等
httpInstance.interceptors.response.use((response: AxiosResponse) => {
  return response
}, (error: AxiosError) => {
  return Promise.reject(error)
})
// 通用的响应类型 外层是相同的替换内容 换成泛型即可
interface HttpResponse<T> {
  code: string
  msg: string
  result: T
}

export { httpInstance, HttpResponse }
 // 请求网络数据
  async getData() {
    // httpInstance.get('/home/banner')
    // 可以通过对象的方式发送请求
    // url 请求地址
    // method 请求方法 大小写不区分 get省略
    const res: AxiosResponse<HttpResponse<Banner[]>> = await httpInstance({
      url: '/home/banner',
      method: 'get'
    })
    Log.info(res.data)
  }
import axios, { InternalAxiosRequestConfig, AxiosError, AxiosResponse, AxiosRequestConfig } from '@ohos/axios'
import { auth } from './auth'
import { promptAction, router } from '@kit.ArkUI'

export const baseURL: string = 'https://meikou-api.itheima.net/'

// 实例化 通用配置
const httpInstance = axios.create({
  // 美蔻的基地址
  baseURL,
  // 超时事件最长多久不响应,就认为是失败
  timeout: 5000
})

// 拦截器配置
// 请求拦截器
// token配置等
httpInstance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  // 有 token 就携带
  if (auth.getUser()
    .token) {
    // 可以吧 token 改错来进行测试
    config.headers['Authorization'] = `Bearer ${auth.getUser()
      .token}`
  }
  return config
}, (error: AxiosError) => {
  return Promise.reject(error)
})

// 增加类型
export interface APIErrorType {
  message: string
  msg: string
  code: string
}

// 添加响应拦截器
// 错误统一处理等
httpInstance.interceptors.response.use((response: AxiosResponse) => {
  return response
}, (error: AxiosError<APIErrorType>) => {
  // 请求异常
  // axios会将异常请求的响应设置在 error.response 中
  // error.response?.status 可以获取状态码
  // AlertDialog.show({
  //   message: JSON.stringify(error.response?.data) + error.response?.status
  //   // message: JSON.stringify(error.response?.status)
  // })

  if (error.response?.status == 400) {
    promptAction.showToast({
      message: error.response.data.msg
    })
  }
  if (error.response?.status == 401) {
    // 提示用户 重新登录
    promptAction.showToast({
      message: '登录信息过期,请重新登录'
    })
    // 原本的用户信息 删掉
    auth.removeUser()
    // 去登录页
    router.pushUrl({
      url: 'pages/LoginPage'
    })
  }
  AlertDialog.show({
    message: JSON.stringify(error.response)
  })

  return Promise.reject(error)
})

// 通用的响应类型,外层都是相同的
// result 不同,利用泛型来动态设置即可
interface HttpResponse<T> {
  code: string
  msg: string
  result: T // result通过泛型动态设置
}

// 通用的请求方法,将 类型,返回值,参数都封装到一起 简化调用
// AxiosRequestConfig<null> 参数类型
// Promise<AxiosResponse<HttpResponse<T>, null>> 返回值类型
// D=null 设置默认值
function fetchData<T, D = null>(config: AxiosRequestConfig<D>): Promise<AxiosResponse<HttpResponse<T>, null>> {
  return httpInstance <null, AxiosResponse<HttpResponse<T>>, D>(config)
}

export { httpInstance, HttpResponse, fetchData }
评论