如何在Android WebView请求中查看请求头?

18
我如何拦截Android WebView发出的所有请求并获取相应的请求标头?我想查看从我的WebView发出的每个请求的标头,包括XHR、脚本源、CSS等。
在iOS上的等效方法是覆盖NSURLCache,这将为您提供所有这些信息。以下可能是我想要的最接近的内容,但据我所见,WebViewClient只会返回字符串:
void onLoadResource(WebView view, String url);
WebResourceResponse shouldInterceptRequest(WebView view, String url);

据我所知,使用Android的WebViewWebViewClient无法读取请求标头。我通过使用轻量级代理解决了这个问题。 - acj
@acj - 你是通过编程在 WebView 上实现代理还是在外部(路由器/网络层)实现的? - Mike Kwan
我在设备设置中的移动网络中进行配置。另一个选项是:如果我只需要一个快速而简单的方法来检查标头,我会在我的笔记本电脑上启动netcat(nc)实例,并将WebView连接到netcat实例。 - acj
如果我理解正确,如果我需要在常规运行期间为用户获取这些标头,那么这些解决方案都不适合生产部署,对吗? - Mike Kwan
1
正确。对于常规运行,可以使用反射编程方式配置代理(示例),但任何这样的方法都将是脆弱且不受支持的。 - acj
显示剩余2条评论
4个回答

18
webview.setWebViewClient(new WebViewClient() {
            @SuppressLint("NewApi")
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                Log.d("", "request.getRequestHeaders()::"+request.getRequestHeaders());

                return null;
            }
        });

这在我的代码中从未触发。我尝试了Anton Prokopov下面的建议,成功地打印出了标题。 - PGMacDesign

3

我在WebView myWebView中拦截请求头时遇到了一些问题。

首先,我尝试为myWebView设置自定义的WebViewClient来实现这个功能。

myWebView.setWebViewClient(new WebViewClient() {

    @Override
            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                Log.v("USERAGENTBROWSE", "shouldOverrideUrlLoading api >= 21 called");

                //some code

                return true;
            }

    @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.v("USERAGENTBROWSE", "shouldOverrideUrlLoading api < 21 called");

                //some code

                return true;
            }

});

但是shouldOverrideUrlLoading(...)方法从未被调用,我真的不知道为什么。

后来我发现可以拦截一些常见的头部信息,如"User-Agent""Cache-Control"等:

myWebView.getSettings().setUserAgentString("your_custom_user_agent_header");
myWebView.getSettings().setCacheMode(int mode);
...

希望这能帮助到某些人。

3
你的问题听起来与这个非常相似,因此直接而明确的答案是在Android的WebView或WebViewClient上无法读取请求头
但是,有一些解决方法可以让你得到所需的内容。 这个答案更详细地描述了如何做到这一点。

0

通过这种方法,你可以启用 Web 视图应用程序的调试功能,并使用 Chrome 开发者工具查看请求、响应、CSS、JavaScript 等的详细信息。


远程调试用于在远程设备上调试Chrome,无法与WebViews一起使用。 - John Sardinha
@JohnSardinha 它可以与 WebView 一起使用。 - c-an

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接