uni.request请求响应拦截封装

该文章展示了如何在uni-app中创建一个request.js文件,使用uni.addInterceptor来拦截请求,设置baseUrl、Content-Type,处理不同状态码的响应,并封装了通用的get函数。当遇到不同的HTTP状态码时,返回相应的提示信息。此外,还提供了用户登录获取验证码的接口示例。
摘要由CSDN通过智能技术生成

新建request.js文件

uni.addInterceptor('request', {
    invoke(args) {//拦截前触发
        let baseUrl = "https://www.xxxx.cn/api/v1/wxapp"
        if (process.env.NODE_ENV === 'development') {
            baseUrl = "http://127.0.0.1:22345/api"
        }
        args.url = baseUrl + args.url
        args.header["Content-Type"] = "application/json;charset=UTF-8"
        //获取token
        let token = uni.getStorageSync('token')
        if (token) {
            args.header["Authorization"] = token
        }
    },
    success(args) {//成功回调拦截
        if (!args || !args.statusCode) {
            return Promise.reject("错误的消息内容。");
        }
        //中文显示
        switch (args.statusCode) {
            case 100:
                args.message = "客户端应继续其请求";
                break;
            case 101:
                args.message = "服务器根据客户端的请求切换协议。";
                break;
            case 200:
                args.message = "请求成功。";
                break;
            case 201:
                args.message = "成功请求并创建了新的资源。";
                break;
            case 202:
                args.message = "已经接受请求,但未处理完成。";
                break;
            case 203:
                args.message = "非授权信息。";
                break;
            case 204:
                args.message = "服务器成功处理,但未返回内容。";
                break;
            case 205:
                args.message =
                    "服务器处理成功,用户终端(例如:浏览器)应重置文档视图。";
                break;
            case 206:
                args.message = "服务器成功处理了部分GET请求。";
                break;
            case 300:
                args.message = "请求的资源可包括多个位置。";
                break;
            case 301:
                args.message = "请求的资源已被永久的移动到新URI。";
                break;
            case 302:
                args.message = "临时移动。";
                break;
            case 303:
                args.message = "查看其它地址。";
                break;
            case 304:
                args.message = "所请求的资源未修改。";
                break;
            case 305:
                args.message = "所请求的资源必须通过代理访问。";
                break;
            case 306:
                args.message = "已经被废弃的HTTP状态码。";
                break;
            case 307:
                args.message = "临时重定向。";
                break;
            case 400:
                args.message = "客户端请求的语法错误,服务器无法理解。";
                break;
            case 401:
                args.message = "请先登录系统。";
                //跳转到登录页面
                break;
            case 402:
                args.message = "暂未定义。";
                break;
            case 403:
                args.message = "服务器理解请求客户端的请求,但是拒绝执行此请求。";
                break;
            case 404:
                args.message = "服务器无法根据客户端的请求找到资源(网页)。";
                break;
            case 405:
                args.message = "客户端请求中的方法被禁止。";
                break;
            case 406:
                args.message = "服务器无法根据客户端请求的内容特性完成请求。";
                break;
            case 407:
                args.message = "请求要求代理的身份认证。";
                break;
            case 408:
                args.message = "服务器等待客户端发送的请求时间过长。";
                break;
            case 409:
                args.message = "服务器处理请求时发生了冲突。";
                break;
            case 410:
                args.message = "客户端请求的资源已经不存在。";
                break;
            case 411:
                args.message =
                    "服务器无法处理客户端发送的不带Content-Length的请求信息。";
                break;
            case 412:
                args.message = "客户端请求信息的先决条件错误。";
                break;
            case 413:
                args.message = "由于请求的实体过大,服务器无法处理,因此拒绝请求。";
                break;
            case 414:
                args.message = "请求的URI过长(URI通常为网址),服务器无法处理。";
                break;
            case 415:
                args.message = "服务器无法处理请求附带的媒体格式。";
                break;
            case 416:
                args.message = "客户端请求的范围无效。";
                break;
            case 417:
                args.message = "服务器无法满足Expect的请求头信息。";
                break;
            case 500:
                args.message = "服务器内部错误,无法完成请求。";
                break;
            case 501:
                args.message = "服务器不支持请求的功能,无法完成请求。";
                break;
            case 502:
                args.message =
                    "作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应。";
                break;
            case 503:
                args.message =
                    "由于超载或系统维护,服务器暂时的无法处理客户端的请求。";
                break;
            case 504:
                args.message = "充当网关或代理的服务器,未及时从远端服务器获取请求。";
                break;
            case 505:
                args.message = "服务器不支持请求的HTTP协议的版本,无法完成处理。";
                break;
            default:
                args.message = "状态错误(" + args.statusCode + ")";
                break;
        }
        //处理状态码
        if (args.statusCode !== 200) {
            uni.showToast({
                title: args.message,
            })
            return Promise.reject(args.message);
        }
        if(!args.data || !args.data.code || !args.data.msg){
            return Promise.reject("错误的数据内容。");
        }
        //处理消息码
        if (args.data && args.data.code !== 200) {
            uni.showToast({
                title: args.data.msg,
            })
            return Promise.reject(args.data.msg);
        }
        //返回消息 
        return Promise.resolve(args.data.data)
    },
    fail() {//失败回调拦截
        uni.showToast({
            title: "无法发起请求",
        })
    },
})

function get(url, params) {
    const promise = new Promise((resolve, reject) => {
        uni.request({
            url: url,
            data: params,
            header: {},//必须的,用于拦截请求
            success: (res) => {
                //上面已经对错误进行了处理,直接返回的就是data
                resolve(res);
            },
            fail: (err) => {
                reject(err)
            }
        });
    });
    return Promise.resolve(promise);
}

export default {
    get,
};

封装接口,如user.js

import request from "@/utils/request";

function getCode(mobile) {
    return request.get("/user/login", { mobile: mobile });
}

export default {
    getCode,
};

页面引入

import userApis from "@/apis/user.js";

调用

  async created() {
    //测试网络
    await userApis.getCode("123456789");
  },
Vue框架中,若要将微信小程序的接口操作封装以便在UniApp中复用,可以使用UniApp提供的`uni.request`方法,它是一个基于Promise的网络请求API。以下是基本的封装步骤以及涉及的响应拦截和设置请求头: 1. 引入uni.request: 首先,在Vue组件的script部分引入`uni`对象,它是 UniApp 的核心API之一。 ```javascript import { uni } from '@dcloudio/uni-app' ``` 2. 定义接口函数: 创建一个自定义函数,如`wxRequest`,接受请求配置对象作为参数,并返回一个Promise。 ```javascript export const wxRequest = async (config) => { try { return await uni.request(config); } catch (error) { // 处理错误,例如日志记录或通知用户 console.error('Network error:', error); throw new Error(error.message); // 或者根据需要抛出错误信息 } } ``` 3. 设置请求头: 在配置对象`config`中,你可以通过`headers`属性添加自定义的请求头。例如,设置"Content-Type"为JSON格式: ```javascript const headers = { 'Content-Type': 'application/json', }; const config = { url: 'https://your-api-url.com', // 将此处替换为实际的API地址 method: 'POST', // 请求方式 data: { key: 'value' }, // 发送的数据 headers, }; await wxRequest(config); ``` 4. 响应拦截: 虽然uni.request本身提供了一定程度的错误处理,但在全局范围内,你可能希望对所有请求都统一处理响应状态。可以通过Vue的生命周期钩子或Vuex的状态管理来实现。例如,可以在`created`或`mounted`阶段设置一个全局的响应拦截器: ```javascript export default { created() { uni.request.onShowLoading({ title: '加载中...', mask: true, success() { this.$store.dispatch('clearError')(); // 清除之前的错误 }, }); uni.request.onError((err) => { this.$store.commit('setError', err); // 存储错误并显示给用户 }); }, // ... }; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值