HarmonyOS 鸿蒙 @ohos/axios的封装

打印 上一主题 下一主题

主题 967|帖子 967|积分 2901

@ohos/axios的先容

@ohos/axios文档是类似于前端axios的http请求库,相对于官方提供的@ohos.net.http模块更好用
@ohos/axios依赖的安装

  1. ohpm install @ohos/axios
复制代码
@ohos/axios的封装

主要代码如下:
  1. import axios, { AxiosInstance, AxiosResponse, AxiosError,AxiosRequestConfig } from '@ohos/axios';
  2. import {ResultEnum,RequestEnum,BASEURL} from './httpEnum';
  3. import {preferenceUtils} from  '../common/preferenceUtils'
  4. let context = getContext(this);
  5. // 定义请求配置接口,支持动态传递 token
  6. interface RequestData<P> {
  7.   url: string; // 请求的 URL
  8.   contentType?: string; // 请求的 Content-Type
  9.   token?: string; // 动态传递的 Token
  10.   params?: P; // 查询参数类型
  11.   method:RequestEnum // 请求方式
  12. }
  13. // 创建 Axios 实例
  14. const instance: AxiosInstance = axios.create({
  15.   baseURL: BASEURL.baseUrl, // 基路径
  16.   timeout: 5000, // 超时时间
  17. });
  18. // 响应拦截器
  19. instance.interceptors.response.use(
  20.   async(response: AxiosResponse) => {
  21.     // 处理响应数据
  22.     if (response.status === ResultEnum.SUCCESS) {
  23.       // token持久化处理
  24.       if(response.data.token){
  25.         preferenceUtils().set(context,'token_store','token',response.data.token);
  26.       }
  27.       return response.data; // 返回完整的响应数据
  28.     }
  29.     return Promise.reject(response); // 抛出错误交由 catch 处理
  30.   },
  31.   (error: AxiosError) => {
  32.     return Promise.reject(error);
  33.   }
  34. );
  35. /**
  36. * GET 请求
  37. * @param requestData 请求配置
  38. * @returns 返回 Promise 对象,数据类型由泛型 T 指定
  39. */
  40. export async function httpRequest<T, P> (requestData: RequestData<P>): Promise<T> {
  41.   // 动态设置 headers 的 Token
  42.   const headers: Record<string, string> = {};
  43.   if (requestData.token) {
  44.     // token处理
  45.     const token =  preferenceUtils().get(context,'token_store','token') as string
  46.     token && (headers.Authorization = String(token));
  47.   }
  48.   // 请求参数格式
  49.   if(requestData.contentType){
  50.     headers['Content-Type'] = requestData.contentType;
  51.   }
  52.   const config:AxiosRequestConfig ={
  53.     url: requestData.url,
  54.     method: requestData.method,
  55.     headers,
  56.   };
  57.   if (requestData.method === RequestEnum.POST || requestData.method === RequestEnum.PUT) {
  58.     config.data = requestData.params; // POST 或 PUT 请求需要将参数放在 data 中
  59.   } else {
  60.     config.params = requestData.params; // GET 或 DELETE 请求需要将参数放在 params 中
  61.   }
  62.   return instance.request(config);
  63. }
复制代码
导入的httpEnum.ets文件的内容:
  1. /**
  2. * @description: Request result set
  3. */
  4. export enum ResultEnum {
  5.   SUCCESS = 200,
  6.   ERROR = 1,
  7.   UNAUTHORIZED = 401,
  8. }
  9. /**
  10. * @description: request method
  11. */
  12. export enum RequestEnum {
  13.   GET = "get",
  14.   POST = "post",
  15.   PUT = "put",
  16.   DELETE = "delete",
  17. }
  18. /**
  19. * @description:  contentType
  20. */
  21. export enum ContentTypeEnum {
  22.   // json
  23.   JSON = "application/json;charset=UTF-8",
  24.   // form-data qs
  25.   FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8",
  26.   // form-data  upload
  27.   FORM_DATA = "multipart/form-data;charset=UTF-8",
  28. }
  29. /**
  30. * baseUrl
  31. */
  32. export enum BASEURL {
  33.   baseUrl = 'http://xxxxxx'
  34. }
复制代码
导入的preferenceUtils.ets是对preference做的一个简朴的封装具体代码如下:
  1. import dataPreferences  from '@ohos.data.preferences';
  2. import { Context } from '@kit.AbilityKit'
  3. // 定义 PreferenceUtils 的接口类型
  4. interface PreferenceUtils {
  5.   set: (
  6.     context: Context,
  7.     storeName: string,
  8.     key: string,
  9.     value: dataPreferences.ValueType
  10.   ) => Promise<void>;
  11.   get: (
  12.     context: Context,
  13.     storeName: string,
  14.     key: string
  15.   ) => dataPreferences.ValueType | null;
  16.   deleteFn: (
  17.     context: Context,
  18.     storeName: string,
  19.     key: string
  20.   ) => Promise<void>;
  21. }
  22. // preferenceUtils 函数的实现
  23. export function preferenceUtils(): PreferenceUtils {
  24.   const getStore = (context: Context, storeName: string) => {
  25.     return dataPreferences.getPreferencesSync(context, {
  26.       name: storeName,
  27.     });
  28.   };
  29.   const set = async (
  30.     context: Context,
  31.     storeName: string,
  32.     key: string,
  33.     value: dataPreferences.ValueType
  34.   ) => {
  35.     const store = getStore(context, storeName);
  36.     store.putSync(key, value);
  37.     await store.flush(); // flush操作是将数据进行本地持久化
  38.   };
  39.   const get = (
  40.     context: Context,
  41.     storeName: string,
  42.     key: string
  43.   ): dataPreferences.ValueType | null => {
  44.     const store = getStore(context, storeName);
  45.     return store.getSync(key, null);
  46.   };
  47.   const deleteFn = async (
  48.     context: Context,
  49.     storeName: string,
  50.     key: string
  51.   ) => {
  52.     const store = getStore(context, storeName);
  53.     store.deleteSync(key);
  54.     await store.flush(); // 更新到磁盘
  55.   };
  56.   return {
  57.     set,
  58.     get,
  59.     deleteFn,
  60.   };
  61. }
复制代码
封装后使用

经过封装后使用起来就很简朴了:
  1. import {httpRequest} from '../axios';
  2. import {LoginDTO,Params} from './loginModel'
  3. import {RequestEnum} from '../httpEnum'
  4. enum Api {
  5.   Login = "/boss/user/validlogin", //登录
  6. }
  7. export const LoginService = (params: Params) => {
  8.   return httpRequest<LoginDTO,Params>({
  9.     method:RequestEnum.GET,
  10.     url:Api.Login,
  11.     params
  12.   });
  13. };
复制代码
其中loginModel.ets文件内容:
  1. import {BasicResult} from './baseModel'
  2. export interface Params{
  3.   username:string,
  4.   password:string
  5. }
  6. export interface Login {
  7.   id?: number;
  8.   username?: string;
  9.   password?: string;
  10. }
  11. export type LoginDTO = BasicResult<Login>
复制代码
其中baseModel.ets文件内容
  1. export interface BasicResult<T>{
  2.   msg:string;
  3.   code:number;
  4.   data:T;
  5.   token:string;
  6. }
复制代码
总结:本章先容了@ohos/axios的简朴封装使用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表