【问题标题】:How do I see request headers on Android WebView requests?如何查看 Android WebView 请求的请求标头?
【发布时间】:2013-10-30 19:53:54
【问题描述】:

如何拦截所有来自 Android WebView 的请求并获取相应的请求标头?我想查看我的WebView 发出的每个请求的标头,包括 XHR、脚本源、css 等。

iOS 上的等价物是覆盖NSURLCache,它将为您提供所有这些信息。以下可能是最接近我想要的,但据我所知WebViewClient 只会给我们返回字符串:

void onLoadResource(WebView view, String url);
WebResourceResponse shouldInterceptRequest(WebView view, String url);

【问题讨论】:

  • Android 的 WebViewWebViewClient 无法读取请求标头,afaik。我使用轻量级代理解决了这个问题。
  • @acj - 您是否以编程方式在 WebView 或外部(路由器/网络级别)上进行代理?
  • 我在设备设置中的移动网络中配置它。另一种选择:如果我只需要一种快速而简单的方法来检查标题,我将在我的笔记本电脑上启动一个 netcat (nc) 实例并将WebView 连接到 netcat 实例。
  • 如果我理解正确,如果我需要在用户的常规运行期间获取这些标头,这些解决方案都不适合生产部署,对吧?
  • 正确。对于常规运行,可以使用反射 (example) 以编程方式配置代理,但任何此类方法都是脆弱且不受支持的。

标签: android webview


【解决方案1】:
webview.setWebViewClient(new WebViewClient() {
            @SuppressLint("NewApi")
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                Log.d("", "request.getRequestHeaders()::"+request.getRequestHeaders());

                return null;
            }
        });

【讨论】:

  • 这从来没有触发我的代码。我在下面尝试了Anton Prokopov 的建议,并成功打印了标题。
【解决方案2】:

您的问题听起来与this one 非常相似,因此直接且明确的答案是无法读取Android 的WebView 或WebViewClient 上的请求标头

不过,有一些变通方法可以让您获得所需的东西。 This answer 更详细地描述了如何做到这一点。

【讨论】:

    【解决方案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"等一些常见的header:

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

    希望它可以帮助某人。

    【讨论】:

      【解决方案4】:

      通过this way,您可以启用 Web 视图应用程序的调试,并使用 Chrome 开发人员工具查看您的请求、响应、css、javascripts 等的完整详细信息

      【讨论】:

      • 远程调试用于在远程设备上调试 Chrome,不适用于 WebViews
      • @JohnSardinha 它适用于 WebView。
      猜你喜欢
      • 2015-04-16
      • 2018-09-30
      • 2019-01-06
      • 2019-12-08
      • 1970-01-01
      • 2015-12-07
      • 2016-03-24
      相关资源
      最近更新 更多