0


uniapp 使用axios

第一步:安装axios

npm install axios

注意:如果你的uniapp项目中还没有“package.json”文件,请先初始化项目:

npm init -y 

第二步:配置axios请求拦截器

request.js

import axios from 'axios'
import errorCode from '@/utils/errorCode'
import {
    tansParams
} from '@/utils/ruoyi'

const server = require('../config/server.config')

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
    // axios中请求配置有baseURL选项,表示请求URL公共部分
    // baseURL: process.env.VUE_APP_BASE_API,
    baseURL: server.apiUrl,
    // 超时(毫秒)
    timeout: 10000
})

//请求计数
let reqNum = 0
// request拦截器
service.interceptors.request.use(config => {
    console.log("axios请求拦截器")
    // 在请求发出之前进行一些操作,每次发出请求就 reqNum++
    reqNum++
    // 是否需要设置 token
    const isToken = (config.headers || {}).isToken === false
    // 是否需要防止数据重复提交
    const isRepeatSubmit = (config.headers || {}).repeatSubmit === false
    if (!isToken) {
        config.headers['uniapp'] = 'Y ' // 让每个请求携带自定义token 请根据实际情况自行修改
    }
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
        let url = config.url + '?' + tansParams(config.params)
        url = url.slice(0, -1)
        config.params = {}
        config.url = url
    }
    if (!isRepeatSubmit && (config.method === 'post' || config.method === 'put')) {
        const requestObj = {
            url: config.url,
            data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
            time: new Date().getTime()
        }

    }
    return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
        console.log("axios响应拦截器")
        // 接受请求后 reqNum--,判断请求所有请求是否完成
        reqNum--
        if (reqNum <= 0) {
            // console.log('请求完毕')
        } else {
            // console.log('接口' + reqNum + '请求中')
        }
        // 未设置状态码则默认成功状态
        const code = res.data.code || 200
        // 获取错误信息
        const msg = errorCode[code] || res.data.msg || errorCode['default']
        // 二进制数据则直接返回
        // if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
        //     return res.data
        // }
        if (code === 401) {
            return Promise.reject('(401):请求要求身份验证。对于需要登录的网页,服务器可能返回此响应')
        } else if (code === 500) {
            uni.showToast({
                title: msg,
                duration: 2000
            });

            return Promise.reject(new Error(msg))
        } else if (code !== 200) {
            uni.showToast({
                title: msg,
                duration: 2000
            });

            return Promise.reject('error')
        } else {
            return res.data
        }
    },
    error => {
        console.log('err' + error)
        let {
            message
        } = error
        if (message == 'Network Error') {
            message = '后端接口连接异常'
        } else if (message.includes('timeout')) {
            message = '系统接口请求超时'
        } else if (message.includes('Request failed with status code')) {
            message = '系统接口' + message.substr(message.length - 3) + '异常'
        }

        uni.showModal({
            title: '提示',
            content: message,
            success: function(res) {
                if (res.confirm) {
                    console.log('用户点击确定');
                } else if (res.cancel) {
                    console.log('用户点击取消');
                }
            }
        });

        return Promise.reject(error)
    }
)

export default service

第三步: 在main.js中做axios适配

解释:为了解决uniapp 适配axios请求,避免报adapter is not a function错误

import axios from 'axios'

// 解决uniapp 适配axios请求,避免报adapter is not a function错误
axios.defaults.adapter = config => {
    return new Promise((resolve, reject) => {
        let settle = require('axios/lib/core/settle');
        let buildURL = require('axios/lib/helpers/buildURL');
        uni.request({
            method: config.method.toUpperCase(),
            url: config.baseURL + buildURL(config.url, config.params, config.paramsSerializer),
            header: config.headers,
            data: config.data,
            dataType: config.dataType,
            responseType: config.responseType,
            sslVerify: config.sslVerify,
            complete: function complete(response) {
                // console.log("执行完成:", response)
                response = {
                    data: response.data,
                    status: response.statusCode,
                    errMsg: response.errMsg,
                    header: response.header,
                    config: config
                };
                settle(resolve, reject, response);
            }
        })
    })
}

第四步:创建接口配置js文件

login.js

import request from '@/utils/request'

/**
 * 授权登录
 * @param {*} data 
 */
export function wxLogin(data) {
    return request({
        url: '/wedding/hq-applets-user/wxLogin',
        method: 'post',
        params: {},
        data
    })
}

第五步:调取接口

login.vue

//引入
import { wxLogin } from '@/api/wxLogin.js';

//调用
wxLogin(obj).then(res => {

        console.log('登录结果:', res);

        }).catch(err => {

        console.error('登录结果:', err);

        }).finally(() => {
        console.error('最终回调');

});

本文转载自: https://blog.csdn.net/wcdunf/article/details/125394205
版权归原作者 wcdunf 所有, 如有侵权,请联系我们删除。

“uniapp 使用axios”的评论:

还没有评论