在Android WebView中应用shouldInterceptRequest方法,向所有请求添加自定义头部

7

我希望能够在Webview中向请求添加自定义标题。我认为可以在shouldInterceptRequest中实现这一点。由于我的最低API级别小于21,因此也会调用shouldInterceptRequest(final WebView view, final String url),因此我需要在此处添加标题,但我不确定如何实现。

@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            request.getRequestHeaders().put("ClientId", "ANDROID");
            request.getRequestHeaders().put("Tokon", token);
        }

        return super.shouldInterceptRequest(view, request);
    }

    @Override
    public WebResourceResponse shouldInterceptRequest(final WebView view, final String url) {
        // I need to updated the header here

        return super.shouldInterceptRequest(view, url);
    }

有一个建议是使用view.loadUrl(url,headers),但这也不起作用。
1个回答

1
在API 21之前,你会遇到一个问题,即shouldInterceptRequest只提供被拦截的URL和webview,而没有请求正文。我也遇到了这个问题,并发现了以下GitHub存储库。

https://github.com/KeejOow/android-post-webview

这个项目的重要部分是 assets 文件夹中的 interceptheader.html。该 html 包含插入到 webview 加载的每个 html 响应顶部的 javascript。此 JS 拦截页面上的每个表单和 ajax 提交,并将正文数据加载到一个 java 类中。接下来,shouldInterceptRequest 方法根据正文中是否有任何数据来确定请求是 POST 还是 GET(不幸的是,你只能得到这两个)。

最后,一旦它已经整理了所有相关信息,它会自己执行请求(而不是将其传递给 Android),返回生成的 WebResourceResponse。

请注意,此存储库已经有些过时了。我必须进行一些调整才能使页面按照我的意愿工作。

添加头文件的最佳位置是 shouldInterceptRequest 下的 InterceptingWebViewClient 类。

conn.setRequestProperty("header-name", value);

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