dart 在Flutter webview中拦截 AJAX 在iOS上有效,但在Android上无效

dffbzjpn  于 2023-04-27  发布在  Flutter
关注(0)|答案(1)|浏览(355)

我试图使用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;
bq3bfh9z

bq3bfh9z1#

flutter_inappbrowser现在通常被称为flutter_inappwebview
为了能够在Flutter webview中拦截 AJAX ,我相信你需要监听事件shouldInterceptAjaxRequest
XMLHttpRequest发送到服务器时激发的事件。它使主机应用程序有机会在发送请求之前控制请求。
ajaxRequest表示XMLHttpRequest
还请注意,您只能通过将InAppWebViewOptions.useShouldInterceptAjaxRequest选项设置为true来侦听此事件。
参见相关文章:

相关问题