uniapp封装请求拦截和响应拦截器,统一封装!!超全!超优雅

直接上代码

首先封装一个共同的地址文件,通常命名config.js

// 开发环境配置
export let baseUrl;
export let version;
if (process.env.NODE_ENV === 'development') {
  baseUrl = "http://192.168.10.154:8090/";
} else {
  baseUrl = "http://192.168.10.154:8090/";
}
version ='v3.0.0';

if (typeof baseUrl === 'undefined') {
  console.error('请检查.env配置文件是否存在');
} else {
  console.log(`[ma ${version}] `);
}

export const apiPath = '/api/ops/';

export const staticUrl = '';

export default {
  baseUrl,
  apiPath,
  staticUrl,
};

 下面是封装的拦截器

一般情况下命名 request.js

import Request from 'luch-request';
import {
	baseUrl,
	apiPath
} from './config';

// 创建一个请求实例  
const http = new Request({
	baseURL: baseUrl,
	timeout: 8000,
	header: {
		'Content-Type': 'application/json;charset=UTF-8',
	},
});

// Loading全局实例  
let loadingInstance = null;

// 显示loading  
function showLoading(message = '加载中') {
	if (!loadingInstance) {
		loadingInstance = uni.showLoading({
			title: message,
			mask: true,
		});
	}
}



// 请求拦截器  
http.interceptors.request.use(
	(config) => {
		const token = uni.getStorageSync('token');
		if (token) {
			config.header['token'] = token;
		}
		// 显示loading(可根据需要添加条件)  
		showLoading();
		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

// 响应拦截器  
http.interceptors.response.use(
	(response) => {
		// 隐藏loading  
		uni.hideLoading()
		// 假设服务器返回的数据格式包含{code, data, msg}  
		if (response.data.code !== 200) {
			// 显示错误信息(可根据需要自定义)  
			uni.showToast({
				title: response.data.msg || '请求失败,请稍后再试',
				icon: 'none',
			});
			return Promise.reject(response.data);
		}
		return Promise.resolve(response.data);
	},
	(error) => {
		// 隐藏loading(确保无论成功还是失败都隐藏loading)  
		uni.hideLoading()
		// 显示通用错误信息(可根据需要自定义)  
		uni.showToast({
			title: '网络请求出错,请检查您的网络连接',
			icon: 'none',
		});
		return Promise.reject(error);
	}
);

// 封装请求函数  
const request = (config) => {
	// 确保URL以斜杠开头(如果不是以apiPath作为前缀)  
	if (config.url && config.url[0] !== '/') {
		config.url = apiPath + config.url;
	}
	return http.middleware(config);
};

export default request;

luch-request  下载一下即可

下面便是使用示例了

// 引入封装好的request函数  
import request from '@/utils/request.js'; // 根据你的文件路径调整  
import {
	baseUrl
} from '../config';

// 换电站 列表
export const getDataList = (data) => {
	return request({
		url: 'station/getSummaryInfo',
		method: 'GET',
		data: {
			...data,
		},
		custom: {
			showError: false,
			showLoading: false,
		},
	})
}
// 换电站 获取详情
export const getDetail = (data) => {
	return request({
		url: `station/getDetail`,
		method: 'GET',
		data: {
				...data,
		},
		custom: {
			showError: false,
			showLoading: false,
		},
	})
}



Uniapp封装请求拦截可以使用uni-app提供的拦截器功能,具体步骤如下: 1. 在common目录下新建一个request.js文件,用于封装请求拦截器。 2. 在request.js文件中定义一个request拦截器,并在其中添加请求头、请求参数等信息。示例代码如下: ``` import Vue from 'vue' import axios from 'axios' import qs from 'qs' axios.defaults.baseURL = 'http://localhost:8080/' axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8' // 添加请求拦截器 axios.interceptors.request.use( config => { // 在发送请求之前做些什么 if (config.method === 'post') { config.data = qs.stringify(config.data) } return config }, error => { // 对请求错误做些什么 return Promise.reject(error) } ) export default axios ``` 3. 在main.js文件中引入request.js文件,并将其挂载到Vue原型链上。示例代码如下: ``` import Vue from 'vue' import App from './App' import request from './common/request' Vue.config.productionTip = false // 将request挂载到Vue原型链上 Vue.prototype.$request = request App.mpType = 'app' const app = new Vue({ ...App }) app.$mount() ``` 4. 在需要请求数据的组件中,使用this.$request来发送请求即可。示例代码如下: ``` export default { data () { return { dataList: [] } }, mounted () { this.getDataList() }, methods: { async getDataList () { try { const res = await this.$request.get('/api/list') this.dataList = res.data } catch (error) { console.log(error) } } } } ``` 这样,我们就完成了Uniapp封装请求拦截的过程。通过这种方式,我们可以在局范围内添加请求头、请求参数等信息,从而方便地进行请求处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端_彭于晏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值