如何拦截webview的post请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何拦截webview的post请求相关的知识,希望对你有一定的参考价值。

参考技术A [java] view plain copy print?
WebView webView = (WebView) findViewById(R.id.web_view);
webView.setWebViewClient(new WebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
Toast.makeText(getApplicationContext(), "WebViewClient.shouldOverrideUrlLoading",
Toast.LENGTH_SHORT);
view.loadUrl(url);
return true;


@Override
public void onPageStarted(WebView view, String url, Bitmap favicon)
Toast.makeText(getApplicationContext(), "WebViewClient.onPageStarted",
Toast.LENGTH_SHORT).show();

// 这儿可以截获网页的URL,可以对URL进行分析。
// 本例子之中是分析从通过RenRen登录成功后返回的access_token.
if (url.contains("graph.renren.com/oauth/login_success.html"))
int start = url.indexOf("access_token") + "access_token=".length();
int end = url.indexOf("expires_in") - 1;
accessToken = url.substring(start, end);

super.onPageStarted(view, url, favicon);

);
webView.loadUrl(myUrl);

UWP 拦截 Webview POST 请求并获取内容

【中文标题】UWP 拦截 Webview POST 请求并获取内容【英文标题】:UWP intercept Webview POST request and get the content 【发布时间】:2021-03-03 13:15:33 【问题描述】:

使用 UWP/XAML,我试图通过处理 WebResourceRequested 来拦截 WebView 的 POST(表单和文件上传)请求并获取要保存的内容,但是 Content keep 在本地窗口中显示“”并且不能被访问。我如何才能访问内容?

private void WebView_WebResourceRequested(WebView sender, WebViewWebResourceRequestedEventArgs args)

    if (request.Method.Method == "POST")
    
        HttpStreamContent content = (HttpStreamContent) args.request.Content;
        var contentBuffer = content.ReadAsBufferAsync().GetResults();
        byte[] buffer = contentBuffer.ToArray();
                        

非常感谢。

【问题讨论】:

您是否尝试将帖子 uri 添加到 content uris。 我试图获取包含表单提交和上传文件内容的 html POST 请求的实际正文。它应该在带有要访问的流对象的 Content 属性中,但值始终为“”。 【参考方案1】:

UWP拦截Webview POST请求并获取内容

这是 WebView1 中的已知问题。 目前,我们提供了一种解决方法,使用ReadAsInputStreamAsync 获取请求内容并使用固定长度加载缓冲区。因为它是非搜索流。我对我们拥有的简单复制样本进行了成功测试。

 private async void MyWebView_WebResourceRequested(WebView sender, WebViewWebResourceRequestedEventArgs args)
    

        if (args.Request.Method.Method == "POST")
        

            if (args.Request.Content != null)
            
                var bodyStream = await args.Request.Content.ReadAsInputStreamAsync();
                var buffer = new Windows.Storage.Streams.Buffer(4096);
                await bodyStream.ReadAsync(buffer, 4096, Windows.Storage.Streams.InputStreamOptions.None);
                var reader = Windows.Storage.Streams.DataReader.FromBuffer(buffer);
                var len = reader.UnconsumedBufferLength;
                var body = reader.ReadString(len);

                Debug.WriteLine($"Body from POST request: body");

                        
        
    

当然,只要我们为发布数据提供足够大的缓冲区,这段代码就可以工作。对于此示例,这里 4096 字节的缓冲区足以获取发布的整个数据。

【讨论】:

所以它可以作为输入流使用。我虽然它已经在缓冲区中发送了所有内容。谢谢。我很高兴它仍然受到管理,因此我不必等待 WebView2。 但它无法读取上传文件的内容。我想知道是否有任何解决方法。或者它首先没有被 HttpRequestMessage 覆盖。 @yosimadsu,是的,我知道,恐怕解决方法不能那样工作。您需要在调用 ReadAsync 之前正确调整缓冲区大小。 我已经尝试了很多方法来读取 http POST 多部分,但似乎这是 WebView 控件的限制。可能我确实需要等待 WebView2 并尝试同样的事情,或者我必须制作自己的 webview。谢谢。

以上是关于如何拦截webview的post请求的主要内容,如果未能解决你的问题,请参考以下文章

QT中 如何让webView发送post请求?

Burp Suite如何拦截GET请求提交POET请求的参数

Puppeteer 如何拦截多个请求

android webview中的loadUrl方法是get请求还是post

webview怎么获取拦截页面中的Post数据?

深入浅出Java!java拦截器获取请求post参数