【uniapp】跨域代理及一些常见问题:

1、法一:
manifest.json文件

"h5": {
	"devServer": {
		"port": 8000,
		"disableHostCheck": true,
		"proxy": {
			"/api": {
				"target": "http://121.204.170.197:8000/i8",//代理的接口
				 "changeOrigin": true,//是否跨域
		         "secure": false,   // 设置支持https协议的代理
			     //"pathRewrite": {	"^/api": "" }  //如需去掉前缀则加上此配置 
			},
			//"/web": {
			//	"target": "http://121.204.170.197:8000/i8",
			//	"changeOrigin": true,//是否跨域
		    //   "secure": false   // 设置支持https协议的代理
			//	//"pathRewrite": {	"^/web": "" }  //如需去掉前缀则加上此配置 
			//}
		}
	},
}
2、法二:
vue.config.js文件=>vue中跨域是一样的

// 跨域配置
module.exports = {
	devServer: { //记住,别写错了devServer//设置本地默认端口  选填
		port: 8000,
		proxy: { //设置代理,必须填
			'/api': { //设置拦截器  拦截器格式   斜杠+拦截器名字,名字可以自己定
				target: 'http://121.204.170.197:8000/i8', //代理的目标地址
				changeOrigin: true, //是否设置同源,输入是的
				pathRewrite: { //路径重写
					'/api': '' //选择忽略拦截器里面的单词
				}
			},
			//'/web': { //设置拦截器  拦截器格式   斜杠+拦截器名字,名字可以自己定
			//	target: 'http://121.204.170.197:8000/i8', //代理的目标地址
			//	changeOrigin: true, //是否设置同源,输入是的
			//	pathRewrite: { //路径重写
			//		'/web': '' //选择忽略拦截器里面的单词
			//	}
			//}
		}
	}
}
3、使用:
manifest.json优先级高于vue.config.js
uni.request({
	url: '/api/PMS/MwApi/GetMwBaseData',//  /api要与上面的/api一致
	//url: '/api'+'/PMS/MwApi/GetMwBaseData',//  /api要与上面的/api一致
	//url: '/web/PMS/MwApi/GetMwBaseData',
	method: 'GET',
	data: {
		pageIndex: '0', //	string	是	页码	0
		pageSize: '20', //	string	是	每页条数	20
		method: 'Enterprise', //	string	是	业务类型	Enterprise
		searchKey: that.consignee, //	string	否	模糊查询(支持名称和编码)	无
		updateTime: '', //	datetime	否	更新时间(查询该时间之后插入和更新的数据)	2021-07-27 17:15:59.210
	},
	success: (res) => {
		if (res.statusCode == 200) {
			console.log(res.data)
		} else {
			uni.showToast({
				title: res.data.ErrorMessage,
				icon: 'none'
			})
		}
	},
	fail: (err) => {
		uni.showToast({
			title: err.ErrorMessage,
			icon: 'none'
		})
	},
});
4、跨域代理不成功的原因:

uniapp跨域报错Faild to load response data: No resourse with given identifier found

1、"pathRewrite": {	"^/api": "" } 需要的没加,不需要的加上了

2、项目没有重新启动,刷新是不生效的

3、地址,逗号,源码等有误=》如http://121.204.170.197:8000/i8后面还有/i8,容易被遗忘

4、请求头不正确等
5、部署配置:

uniapp跨域官网

(1)安装egg-cors包

npm i egg-cors --save

(2)在plugin.js中设置开启cors

'use strict';
/** @type Egg.EggPlugin */

module.exports = {
	cors: {
		enable: true,
		package: 'egg-cors',
	},
}

(3)在config.default.js中配置

config.security = {
	domainWhiteList: ['*'], //允许访问接口的白名单(跨域地址要允许你的服务器地址访问),例如:http://localhost:8080 *表示均可访问
};
//cors
// config.cors = {
// 	origin: "*",
// 	allowMethods: "GET, HEAD, PUT, POST, DELETE, PATCH",
// 	credentials: true
// }

在这里插入图片描述

6.遇到问题:

在这里插入图片描述

让后端配置CORS吧
7.
import Vue from 'vue'
import axios from 'axios'
 
// 创建axios对象
const service = axios.create({
	baseURL: 'http://192.168.8.237:8002/api/',
	// 跨域请求是否提供凭据信息(cookie、HTTP认证及客户端SSL证明等),也可以简单的理解为,当前请求为跨域类型时是否在请求中协带cookie。
	// 注意:withCredentials和后端配置的cros跨域不可同时使用
	//withCredentials: true, 
	// 请求超时时间
	timeout: 10000,
	// 是否跨域请求
	crossDomain: true,
	// headers:{
	// 	"Content-Type":"application/json;charset:utf-8",
	// },
	headers:{
		"Content-Type":"multipart/form-data",
	},
	
})
 
// request拦截器,在请求之前做一些处理
service.interceptors.request.use(config => {
	//请求时显示正在加载中
	uni.showLoading({
		title: '加载中~'
	});
	//添加请求头,比如从本地缓存获取token
	if (uni.getStorageSync("Token")) {
		config.headers['token'] = uni.getStorageSync('Token')	
	}
	return config;
	},
	error => {
		return Promise.reject(error);
	}
);
 
// 配置成功后的拦截器
service.interceptors.response.use(res => {
	//请求时成功后关闭正在加载中
	uni.hideLoading();
	// 根据个人后端结构自定义,原文是if (res.data.status == 200),而我这里需要是res.status
	if(res.data.msg=="过期"){
		uni.showToast({
			title:"登陆有效期已过,请重新登陆~",
			icon:"error"
		})
		setTimeout(function() {
			uni.navigateTo({
				url:"/pages/login/login"
			})
		}, 1000);
	}
	if (res.status == 200) {
		return res.data
	} else {
		// 原文是 Promise.reject(res.data.msg),但我这里变量名称是message
		return Promise.reject(res.data.message);
	}
}, error => {
	console.log(error)
	if(error.message=="timeout of 10000ms exceeded"){
		uni.showToast({
			title:"请求超时~",
			icon:'error'
		})
	}
	if (error.response.status) {
		switch (error.response.status) {
			case 401:
				break;
			default:
				break;
		}
	}
	return Promise.reject(error)
})
 
 
// 在main.js中放入这段自定义适配器的代码,就可以实现uniapp的app和小程序开发中能使用axios进行跨域网络请求,并支持携带cookie
axios.defaults.adapter = function(config) {
	return new Promise((resolve, reject) => {
		let settle = require('axios/lib/core/settle');
		let buildURL = require('axios/lib/helpers/buildURL');
		uni.request({
			methods: config.methods.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) {
				response = {
					data: response.data,
					status: response.statusCode,
					errMsg: response.errMsg,
					header: response.header,
					config: config
				};
 
				settle(resolve, reject, response);
			}
		})
	})
}
 
export default service
main.js里面:

import axios from 'utils/https.js';
Vue.prototype.$axios = axios;

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sun Peng

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

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

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

打赏作者

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

抵扣说明:

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

余额充值