uniappx 网络请求拦截器 Promise 、uni.request

223 阅读1分钟

Promise风格的uni.request,超简洁,完整类型提示,泛型支持,完美兼容uni.request配置、前置处理,后置处理,中断请求,动态自定义配置,. . .

插件地址:ext.dcloud.net.cn/plugin?name…

// uts
import { request } from "@/uni_modules/u-req"
const baseUrl = "http://192.168.3.122:4523/m1/4254930-3896452-default"
// 自定义你的拦截器
// #ifdef  APP-ANDROID 
@UTSAndroid.keyword("inline")
@UTSAndroid.keyword("reified")
// #endif
async function post<T>(url : string, data ?: any) : Promise<RequestSuccess<T>> {
    // try catch 块内任意位置都可以: throw new Error("抛出自定义错误")
    try {
        // 前置处理(如处理参数和配置)
        const { result, task } = request<T>({// 支持所有 uni.request 的配置
            url: `${baseUrl}/${url}`,
            method: "POST",
            data
        } as RequestOptions<T>);
        // task.abort() // 中断网络请求
        const res = await result;
        // 后置处理(如处理响应结果)
        return res;
    } catch (err : any) {
        // 处理所有错误
        // err.message!
        throw err;
    }
}
// 声明你的接口
// 注意服务器响应数据一定要和定义的响应类型一致否则会报错:error message invalid json
type login_res = { code : number, token : string, userName : string } // 响应类型建议从外部导入
export function login(data ?: any) { return post<login_res>("login", data) }
// 使用
login({ name: "test", pwd: "123456" })