IT评测·应用市场-qidao123.com
标题:
HarmonyOS 鸿蒙 @ohos/axios的封装
[打印本页]
作者:
千千梦丶琪
时间:
2025-1-8 00:21
标题:
HarmonyOS 鸿蒙 @ohos/axios的封装
@ohos/axios的先容
@ohos/axios文档是类似于前端axios的http请求库,相对于官方提供的@ohos.net.http模块更好用
@ohos/axios依赖的安装
ohpm install @ohos/axios
复制代码
@ohos/axios的封装
主要代码如下:
import axios, { AxiosInstance, AxiosResponse, AxiosError,AxiosRequestConfig } from '@ohos/axios';
import {ResultEnum,RequestEnum,BASEURL} from './httpEnum';
import {preferenceUtils} from '../common/preferenceUtils'
let context = getContext(this);
// 定义请求配置接口,支持动态传递 token
interface RequestData<P> {
url: string; // 请求的 URL
contentType?: string; // 请求的 Content-Type
token?: string; // 动态传递的 Token
params?: P; // 查询参数类型
method:RequestEnum // 请求方式
}
// 创建 Axios 实例
const instance: AxiosInstance = axios.create({
baseURL: BASEURL.baseUrl, // 基路径
timeout: 5000, // 超时时间
});
// 响应拦截器
instance.interceptors.response.use(
async(response: AxiosResponse) => {
// 处理响应数据
if (response.status === ResultEnum.SUCCESS) {
// token持久化处理
if(response.data.token){
preferenceUtils().set(context,'token_store','token',response.data.token);
}
return response.data; // 返回完整的响应数据
}
return Promise.reject(response); // 抛出错误交由 catch 处理
},
(error: AxiosError) => {
return Promise.reject(error);
}
);
/**
* GET 请求
* @param requestData 请求配置
* @returns 返回 Promise 对象,数据类型由泛型 T 指定
*/
export async function httpRequest<T, P> (requestData: RequestData<P>): Promise<T> {
// 动态设置 headers 的 Token
const headers: Record<string, string> = {};
if (requestData.token) {
// token处理
const token = preferenceUtils().get(context,'token_store','token') as string
token && (headers.Authorization = String(token));
}
// 请求参数格式
if(requestData.contentType){
headers['Content-Type'] = requestData.contentType;
}
const config:AxiosRequestConfig ={
url: requestData.url,
method: requestData.method,
headers,
};
if (requestData.method === RequestEnum.POST || requestData.method === RequestEnum.PUT) {
config.data = requestData.params; // POST 或 PUT 请求需要将参数放在 data 中
} else {
config.params = requestData.params; // GET 或 DELETE 请求需要将参数放在 params 中
}
return instance.request(config);
}
复制代码
导入的httpEnum.ets文件的内容:
/**
* @description: Request result set
*/
export enum ResultEnum {
SUCCESS = 200,
ERROR = 1,
UNAUTHORIZED = 401,
}
/**
* @description: request method
*/
export enum RequestEnum {
GET = "get",
POST = "post",
PUT = "put",
DELETE = "delete",
}
/**
* @description: contentType
*/
export enum ContentTypeEnum {
// json
JSON = "application/json;charset=UTF-8",
// form-data qs
FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8",
// form-data upload
FORM_DATA = "multipart/form-data;charset=UTF-8",
}
/**
* baseUrl
*/
export enum BASEURL {
baseUrl = 'http://xxxxxx'
}
复制代码
导入的preferenceUtils.ets是对preference做的一个简朴的封装具体代码如下:
import dataPreferences from '@ohos.data.preferences';
import { Context } from '@kit.AbilityKit'
// 定义 PreferenceUtils 的接口类型
interface PreferenceUtils {
set: (
context: Context,
storeName: string,
key: string,
value: dataPreferences.ValueType
) => Promise<void>;
get: (
context: Context,
storeName: string,
key: string
) => dataPreferences.ValueType | null;
deleteFn: (
context: Context,
storeName: string,
key: string
) => Promise<void>;
}
// preferenceUtils 函数的实现
export function preferenceUtils(): PreferenceUtils {
const getStore = (context: Context, storeName: string) => {
return dataPreferences.getPreferencesSync(context, {
name: storeName,
});
};
const set = async (
context: Context,
storeName: string,
key: string,
value: dataPreferences.ValueType
) => {
const store = getStore(context, storeName);
store.putSync(key, value);
await store.flush(); // flush操作是将数据进行本地持久化
};
const get = (
context: Context,
storeName: string,
key: string
): dataPreferences.ValueType | null => {
const store = getStore(context, storeName);
return store.getSync(key, null);
};
const deleteFn = async (
context: Context,
storeName: string,
key: string
) => {
const store = getStore(context, storeName);
store.deleteSync(key);
await store.flush(); // 更新到磁盘
};
return {
set,
get,
deleteFn,
};
}
复制代码
封装后使用
经过封装后使用起来就很简朴了:
import {httpRequest} from '../axios';
import {LoginDTO,Params} from './loginModel'
import {RequestEnum} from '../httpEnum'
enum Api {
Login = "/boss/user/validlogin", //登录
}
export const LoginService = (params: Params) => {
return httpRequest<LoginDTO,Params>({
method:RequestEnum.GET,
url:Api.Login,
params
});
};
复制代码
其中loginModel.ets文件内容:
import {BasicResult} from './baseModel'
export interface Params{
username:string,
password:string
}
export interface Login {
id?: number;
username?: string;
password?: string;
}
export type LoginDTO = BasicResult<Login>
复制代码
其中baseModel.ets文件内容
export interface BasicResult<T>{
msg:string;
code:number;
data:T;
token:string;
}
复制代码
总结:本章先容了@ohos/axios的简朴封装使用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4