我试图使用XMLHttpRequest
拦截webview中 AJAX 请求。在iOS中,它总是与flutter webview plugin一起正常工作,但相同的脚本注入代码在Android上不起作用。奇怪的是,它甚至没有抛出任何特定的错误。
这方面的一些帮助将是非常有用的,因为这似乎是webview的一个基本功能问题。
最小示例:
我使用以下Javascript代码拦截 AJAX 请求:
var open = window.XMLHttpRequest.prototype.open,
send = window.XMLHttpRequest.prototype.send,
onReadyStateChange;
function openReplacement(method, url, async, user, password) {
console.log('new data22');
var syncMode = async !== false ? 'async' : 'sync';
if (url === '/api/fakeCall') {
console.log('Preparing ' + syncMode + ' HTTP request : ' + method + ' ' + url);
}
return open.apply(this, arguments);
}
function sendReplacement(data) {
console.log('Sending HTTP request data : ', data);
if(this.onreadystatechange) {
this._onreadystatechange = this.onreadystatechange;
}
this.onreadystatechange = onReadyStateChangeReplacement;
return send.apply(this, arguments);
}
function onReadyStateChangeReplacement() {
console.log('HTTP request ready state changed : ' + this.readyState + ' ' + this.readyState + ' ' + XMLHttpRequest.DONE);
if (this.readyState === XMLHttpRequest.DONE) {
if (this.responseText !== "" && this.responseText !== null) {
if (this.responseText.indexOf('fareSessionUUID') !== -1) {
console.log('________________response____________');
var oData = JSON.stringify({'data': this.responseText});
console.log('new data');
console.log(oData);
window.flutter_inappbrowser.callHandler('myHandler', {foo: oData}).then(function(result) {
console.log(result, typeof result);
console.log(JSON.stringify(result));
})
}
}
}
if (this._onreadystatechange) {
return this._onreadystatechange.apply(this, arguments);
}
}
console.log(openReplacement.toString());
window.XMLHttpRequest.prototype.open = openReplacement;
window.XMLHttpRequest.prototype.send = sendReplacement;
1条答案
按热度按时间bq3bfh9z1#
flutter_inappbrowser现在通常被称为flutter_inappwebview。
为了能够在Flutter webview中拦截 AJAX ,我相信你需要监听事件shouldInterceptAjaxRequest:
将
XMLHttpRequest
发送到服务器时激发的事件。它使主机应用程序有机会在发送请求之前控制请求。ajaxRequest
表示XMLHttpRequest
。还请注意,您只能通过将InAppWebViewOptions.useShouldInterceptAjaxRequest选项设置为
true
来侦听此事件。参见相关文章: