uni-app wkwebview下彻底解决ajax跨域问题
uni-app wkwebview下彻底解决ajax跨域问题
尽管官方提供 plus.net.XMLHttpRequest
口口声声说是支持跨域,但实际上本地跨域却不支持,很是扯蛋。
本地跨域是指加载本地 file://
开头(即 file 协议)文件,比如用 ajax 请求本地 html 或 json 文件,在 iOS 的 UIWebView 没问题,但在 WKWebView 下,即使用 plus.net.XMLHttpRequest
也不行,这里想到的方法是自己写一个 XMLHttpRequest,核心是利用 plus.io.resolveLocalFileSystemURL
来实现。修改一下你的程序启动代码,引入这个自定义的 XMLHttpRequest 文件,然后在 plus 初始化相关代码里加入以下代码:
var oxhr = jQuery.ajaxSettings.xhr;
var plusXhr = function() {
try {
return new plus.net.XMLHttpRequest();
} catch ( e ) {}
};
var myXhr = function() {
try {
return new MyXmlHttpRequest();
} catch ( e ) {}
};
jQuery.ajaxSettings.xhr = plusXhr; // 默认使用 plus 的 XMLHttpRequest
var _ajax = $.ajax;
$.ajax = function(url, options) { // 重写 ajax 方法
var urlx = url;
if (typeof url === 'object' && url !== null) {
urlx = url.url;
}
if (urlx.indexOf('http') !== 0) {
jQuery.ajaxSettings.xhr = myXhr; // 本地文件,file 协议或相对路径时使用本地 xhr
} else {
jQuery.ajaxSettings.xhr = plusXhr; // 还原成 plus 自带的
}
return _ajax(url, options);
}
【注】以上是 jQuery 示例,如果是 mui、uni-app 请根据具体情况参照修改。
下载附件:my-xmlhttprequest.js_.zip
在uni-app中使用wkwebview时,遇到ajax跨域问题,通常可以通过配置CORS(跨源资源共享)或者使用代理服务器来解决。由于直接在客户端(即uni-app应用)修改浏览器安全策略来完全绕过跨域限制是不可行的,因此以下方案主要关注服务器端配置和uni-app项目中的代理设置。
方案一:服务器端配置CORS
CORS允许服务器声明哪些来源可以访问该服务器上的资源。服务器端需要设置适当的HTTP头部来允许跨域请求。以下是一个简单的Node.js Express服务器配置CORS的示例:
const express = require('express');
const cors = require('cors');
const app = express();
const corsOptions = {
origin: 'http://your-uni-app-domain.com', // 允许访问的源
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', // 允许的HTTP方法
credentials: true, // 是否允许发送Cookie
};
app.use(cors(corsOptions));
app.get('/api/data', (req, res) => {
res.json({ msg: 'This is CORS-enabled for a specific origin!' });
});
app.listen(3000, () => {
console.log('CORS-enabled web server listening on port 3000');
});
方案二:使用uni-app的代理功能
uni-app提供了代理功能,可以在开发阶段通过配置manifest.json
来绕过跨域问题。以下是一个配置示例:
{
"mp-weixin": { // 或者其他平台配置
"devServer": {
"proxy": {
"/api": {
"target": "http://your-backend-server.com", // 后端服务器地址
"changeOrigin": true, // 是否改变源
"pathRewrite": { "^/api": "" } // 路径重写规则
}
}
}
}
}
在uni-app中进行ajax请求时,只需将URL前缀改为/api
:
uni.request({
url: '/api/data', // 代理后的URL
method: 'GET',
success: (res) => {
console.log(res.data);
},
fail: (err) => {
console.error(err);
}
});
结论
直接在客户端(如uni-app)中彻底解决ajax跨域问题是不可能的,因为这违反了浏览器的同源策略。正确的做法是在服务器端配置CORS或者使用代理服务器来转发请求。上述方案提供了服务器端配置CORS和使用uni-app代理功能的代码示例,可以根据实际情况选择合适的方法来解决跨域问题。