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

时间:2016-06-15 14:39:58

标签: 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);
    }

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

1 个答案:

答案 0 :(得分:0)

使用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);