Uniapp接口封装全攻略:高效开发必备
uniapp 请求接口封装与使用指南
封装请求的必要性
在 uniapp 开发中,直接使用 uni.request 会导致代码重复、维护困难。封装请求接口可以统一处理错误、添加全局配置(如 baseURL、超时时间)、简化调用方式。
基础封装实现
创建一个 request.js 文件,实现基础请求封装:
const BASE_URL = 'https://api.example.com';
function request(options) {
return new Promise((resolve, reject) => {
uni.request({
url: BASE_URL + options.url,
method: options.method || 'GET',
header: {
'Content-Type': 'application/json',
...options.header
},
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data);
} else {
reject(res.data);
}
},
fail: (err) => {
reject(err);
}
});
});
}
高级功能扩展
在基础封装上增加拦截器、Token 管理和错误统一处理:
// 请求拦截器
function requestInterceptor(config) {
const token = uni.getStorageSync('token');
if (token) {
config.header = {
...config.header,
Authorization: `Bearer ${token}`
};
}
return config;
}
// 响应拦截器
function responseInterceptor(response) {
if (response.data.code !== 200) {
uni.showToast({
title: response.data.message || '请求失败',
icon: 'none'
});
return Promise.reject(response.data);
}
return response.data;
}
// 更新后的 request 函数
async function enhancedRequest(options) {
try {
const config = requestInterceptor(options);
const response = await baseRequest(config);
return responseInterceptor(response);
} catch (error) {
uni.showToast({
title: error.message || '网络错误',
icon: 'none'
});
throw error;
}
}
模块化 API 管理
创建 api.js 集中管理所有接口:
import request from './request';
export const userApi = {
login: (data) => request({ url: '/user/login', method: 'POST', data }),
getProfile: () => request({ url: '/user/profile' })
};
export const productApi = {
list: (params) => request({ url: '/products })
};
实际使用示例
在页面中调用封装好的 API:
import { userApi } from '@/api';
export default {
methods: {
async handleLogin() {
try {
const res = await userApi.login({
username: 'admin',
password: '123456'
});
console.log('登录成功', res);
} catch (error) {
console.error('登录失败', error);
}
}
}
};
性能优化建议
对于高频接口可以添加缓存机制,使用 uni.setStorageSync 存储接口数据,在有效期内直接读取缓存。对于上传/下载大文件,建议使用 uni.uploadFile 和 uni.downloadFile 单独处理。
TypeScript 支持
如需更好的类型提示,可以添加类型定义:
interface RequestOptions {
url: string;
method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
data?: any;
header?: Record<string, string>;
}
interface ResponseData<T = any> {
code: number;
message: T;
}
function request<T>(options: RequestOptions): Promise<ResponseData<T>>;
注意事项
跨域问题需在 manifest.json 中配置合法域名。真机调试时需要确保手机与服务器在同一局域网,或使用 HTTPS 协议。小程序端需将域名加入白名单。
通过这种封装方式,可以实现代码复用、统一管理接口、简化业务逻辑调用,显著提升开发效率和可维护性。
BbS.okacop060.info/PoSt/1120_804180.HtM
BbS.okacop061.info/PoSt/1120_917296.HtM
BbS.okacop062.info/PoSt/1120_176793.HtM
BbS.okacop063.info/PoSt/1120_902403.HtM
BbS.okacop065.info/PoSt/1120_484230.HtM
BbS.okacop066.info/PoSt/1120_012428.HtM
BbS.okacop067.info/PoSt/1120_931004.HtM
BbS.okacop068.info/PoSt/1120_164527.HtM
BbS.okacop069.info/PoSt/1120_023447.HtM
BbS.okacop070.info/PoSt/1120_054558.HtM
BbS.okacop060.info/PoSt/1120_724114.HtM
BbS.okacop061.info/PoSt/1120_392309.HtM
BbS.okacop062.info/PoSt/1120_033360.HtM
BbS.okacop063.info/PoSt/1120_261742.HtM
BbS.okacop065.info/PoSt/1120_441408.HtM
BbS.okacop066.info/PoSt/1120_353855.HtM
BbS.okacop067.info/PoSt/1120_437262.HtM
BbS.okacop068.info/PoSt/1120_647129.HtM
BbS.okacop069.info/PoSt/1120_011635.HtM
BbS.okacop070.info/PoSt/1120_881033.HtM
BbS.okacop060.info/PoSt/1120_087710.HtM
BbS.okacop061.info/PoSt/1120_983830.HtM
BbS.okacop062.info/PoSt/1120_173821.HtM
BbS.okacop063.info/PoSt/1120_441634.HtM
BbS.okacop065.info/PoSt/1120_231732.HtM
BbS.okacop066.info/PoSt/1120_267401.HtM
BbS.okacop067.info/PoSt/1120_008581.HtM
BbS.okacop068.info/PoSt/1120_677166.HtM
BbS.okacop069.info/PoSt/1120_030634.HtM
BbS.okacop070.info/PoSt/1120_588409.HtM
BbS.okacop060.info/PoSt/1120_474663.HtM
BbS.okacop061.info/PoSt/1120_408006.HtM
BbS.okacop062.info/PoSt/1120_438719.HtM
BbS.okacop063.info/PoSt/1120_269476.HtM
BbS.okacop065.info/PoSt/1120_419557.HtM
BbS.okacop066.info/PoSt/1120_469789.HtM
BbS.okacop067.info/PoSt/1120_123813.HtM
BbS.okacop068.info/PoSt/1120_927708.HtM
BbS.okacop069.info/PoSt/1120_702795.HtM
BbS.okacop070.info/PoSt/1120_765020.HtM
BbS.okacop060.info/PoSt/1120_297415.HtM
BbS.okacop061.info/PoSt/1120_802722.HtM
BbS.okacop062.info/PoSt/1120_273152.HtM
BbS.okacop063.info/PoSt/1120_381721.HtM
BbS.okacop065.info/PoSt/1120_834062.HtM
BbS.okacop066.info/PoSt/1120_318741.HtM
BbS.okacop067.info/PoSt/1120_088109.HtM
BbS.okacop068.info/PoSt/1120_860339.HtM
BbS.okacop069.info/PoSt/1120_083581.HtM
BbS.okacop070.info/PoSt/1120_784599.HtM
BbS.okacop060.info/PoSt/1120_350431.HtM
BbS.okacop061.info/PoSt/1120_228974.HtM
BbS.okacop062.info/PoSt/1120_586035.HtM
BbS.okacop063.info/PoSt/1120_081351.HtM
BbS.okacop065.info/PoSt/1120_607246.HtM
BbS.okacop066.info/PoSt/1120_971441.HtM
BbS.okacop067.info/PoSt/1120_523835.HtM
BbS.okacop068.info/PoSt/1120_659254.HtM
BbS.okacop069.info/PoSt/1120_290837.HtM
BbS.okacop070.info/PoSt/1120_919349.HtM
BbS.okacop060.info/PoSt/1120_719859.HtM
BbS.okacop061.info/PoSt/1120_442891.HtM
BbS.okacop062.info/PoSt/1120_179064.HtM
BbS.okacop063.info/PoSt/1120_706243.HtM
BbS.okacop065.info/PoSt/1120_628567.HtM
BbS.okacop066.info/PoSt/1120_677622.HtM
BbS.okacop067.info/PoSt/1120_054951.HtM
BbS.okacop068.info/PoSt/1120_129828.HtM
BbS.okacop069.info/PoSt/1120_758887.HtM
BbS.okacop070.info/PoSt/1120_732975.HtM
BbS.okacop071.info/PoSt/1120_078220.HtM
BbS.okacop072.info/PoSt/1120_082854.HtM
BbS.okacop073.info/PoSt/1120_342748.HtM
BbS.okacop074.info/PoSt/1120_421538.HtM
BbS.okacop075.info/PoSt/1120_607158.HtM
BbS.okacop076.info/PoSt/1120_433427.HtM
BbS.okacop077.info/PoSt/1120_001479.HtM
BbS.okacop078.info/PoSt/1120_448810.HtM
BbS.okacop079.info/PoSt/1120_461262.HtM
BbS.okacop080.info/PoSt/1120_703515.HtM


顺丰集团工作强度 319人发布