开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4453|回复: 0
收起左侧

[技术分享] uniapp原生请求封装

[复制链接]
发表于 2021-11-3 10:48:51 | 显示全部楼层 |阅读模式   广东省揭阳市

有没有小伙伴遇到过这种问题,在开发uniapp项目中,打包为app后使用axios请求是无法使用了,这里根据自己开发的项目并且结合网上的大神做了一个uniapp的请求封装(写的很细,大神略过,小白可以康康,有不足的地方多多指点,不喜勿喷)

1.在项目根目录创建一个文件夹apis

目录直接上图


在api里面存放自己的api文件,也贴一个图吧


可以通过传入isLoading来控制这个请求是否开启loading效果

2.request.js中代码如下

 let baseURL = 'https://www.baidu.com';
 /*
   baseURL可以根据环境变量来判断,改为
   let baseURL = process.env.NODE_ENV === 'development' ? 'http://192.168.5.202:8070' : 'https://www.baidu.com';
 */

//默认参数
let config = {
        baseURL: baseURL,
        header: {
                'content-type': 'application/json',
                'token': uni.getStorageSync('token')//根据自身情况是否添加token
        },
        method: 'POST',
        dataType: 'json',
        responseType: 'text',
        sslVerify: false, //是否验证ssl证书
}

//暴露设置token的方法
export function setToken(token) {
        uni.setStorageSync("token", token)
        config.header.token = token
}

/**
 *  拦截器
 * home.php?mod=space&uid=275307 {*} options
 */
let Interceptor = options => {
        options.url = config.baseURL + options.url;
        options.dataType = options.dataType || config.dataType;
        options.data = { ...options.data,
                    language: uni.getStorageSync('language') || 'zh-CN'//根据自身情况,是否后端需要多语言配置,不需要就删掉
        };
        options.header = { ...options.header,
                ...config.header
        };

        options.method = options.method || config.method;
        options.sslVerify = options.sslVerify || config.sslVerify;
        //如果传入loading为true,则显示loadding
        if (options.isloading) {
                uni.showLoading({
                        title: '加载中',
                        mask: true
                })
        }
        return options;
}

/**
 * 响应器
 * @param {*} res
 */
let Responder = res => {
        uni.hideLoading();
        if (res.data.code === "200") {
                return Promise.resolve(res.data);
        } else if (res.data.code === "302") {
                        uni.reLaunch({
                                url: "/pages/login/login"
                        })
                return Promise.reject({msg:"登录失效"});
        } else {
                return Promise.reject(res.data);
        }
}

/**
 * 请求
 *
 * */
let request = (options = {}) => {

        options = Interceptor(options);

        //发起请求
        return new Promise((resolve, reject) => {
            // 判断有无网络验证
            uni.getNetworkType({
                    success(res) {
                            if (res.networkType == 'none') {
                                    uni.showModal({
                                            title: '没有网络',
                                            content: '请检查您的网络',
                                            showCancel: false,
                                            success: (res) => {
                                                    uni.hideLoading()
                                            }
                                    });
                            }else{
                                    uni.request({
                                            ...options,
                                            success: res => {
                                                    resolve(Responder(res))
                                            },
                                            fail: err => {
                                                    reject(err)
                                            }
                                    })
                            }
                    }
            })

        })
}

export default {
        get(url, data, options = {}) {
                options.url = url
                options.data = data
                options.method = 'GET'
                return request(options)
        },
        post(url, data, options = {}) {
                options.url = url
                options.data = data
                options.method = 'POST'
                return request(options)
        }

}

3.index.js中代码如下

/*这里是用到的正则来匹配api文件下的所有js文件后做的一统一暴露,不需要我们一个js一个js文件引入啦*/
let api = {};
const context = require.context("./api", true, /\.js$/);
context.keys().forEach((e) => {
  api = { ...api, ...context(e).default };
});
export default {
        ...api
}

4.最后一步就很简单了,我们只需要在main.js中挂载这些api就行啦

   import api from "./apis"
   Vue.prototype.$api = api;

5.下面看一下在文件中使用方式吧

   onlogin() {
      this.$api
        .login({
          account: this.form.username,
          password: this.form.pwd,
        })
        .then((res) => {
          setToken(res.data.token);
          uni.switchTab({
            url: "/pages/index/index",
          });
        })
        .catch((err) => {
          this.$u.toast(err.msg);
        });
    },

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表