在shouldInterceptRequest Android webview中为所有请求添加自定义标头

Uba*_*hat 7 android webview

我想在webview中为请求添加自定义标头.我认为应该可以这样做shouldInterceptRequest..因为我的最小API级别小于21 shouldInterceptRequest(最终的WebView视图,最终的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);
    }
Run Code Online (Sandbox Code Playgroud)

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

小智 1

使用 API 21 之前遇到的困难是,shouldInterceptRequest 只提供拦截的 URL 和 webview,而没有请求正文。我遇到了同样的问题并发现了以下 GitHub 存储库

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

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

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

请注意,存储库已经有些老化。我必须做一些摆弄才能让页面按照我想要的方式工作。

添加标头的最佳位置是在 shouldInterceptRequest 下的 InterceptingWebViewClient 类中。

conn.setRequestProperty("header-name", value);
Run Code Online (Sandbox Code Playgroud)