为WebView资源请求添加自定义头-android

129
我需要在WebView中的每个请求中添加自定义头信息。 我知道loadURL有参数extraHeaders,但这些仅适用于初始请求。 所有后续请求都不包含头信息。 我查看了WebViewClient中的所有重写方法,但没有任何方法可以向资源请求添加头信息 - onLoadResource(WebView view, String url)。 希望能得到帮助。
谢谢, 雷伊

2
@MediumOne:这不是一个 bug,而是你认为缺失的一个功能。我不知道 HTTP 规范中是否有任何内容指出后续的 HTTP 请求必须镜像前面的任意头信息。 - CommonsWare
1
@CommonsWare:这里“后续”的词义有些误导。当我在任何浏览器中输入“http://www.facebook.com”以加载facebook.com首页时,会有几个支持的“资源请求”来加载CSS、js和img文件。你可以在Chrome中使用F12功能(Network选项卡)来检查这些请求。对于这些请求,webview不会添加头信息。我尝试使用https://addons.mozilla.org/en-us/firefox/addon/modify-headers/插件为FireFox请求添加自定义头信息。该插件能够为所有这样的支持性“资源请求”添加头信息。我认为WebView应该也这样做。 - MediumOne
1
@MediumOne:“我认为WebView应该做同样的事情” - 这是你认为缺失的功能。请注意,您不得不使用插件才能使 Firefox 实现此功能。我并不是说你提出的功能是一个坏主意。我是说将其描述为错误可能无助于让这个建议的功能添加到 Android 中。 - CommonsWare
1
假设我正在使用WebView构建一个浏览器,可以配置为使用自定义HTTP代理。该代理使用自定义身份验证,其中对其的所有请求都应具有自定义标头。现在,webview提供了一个API来设置自定义标头,但在内部,它并没有将标头设置为生成的所有资源请求。也没有其他API可用于设置这些请求的标头。因此,任何依赖于向WebView请求添加自定义标头的功能都会失败。 - MediumOne
1
@CommonsWare - 我在4年后重新访问这个对话。我现在同意 - 这不应该是一个bug。HTTP规范中没有任何内容表明后续请求应该发送相同的标头。 :) - MediumOne
显示剩余3条评论
13个回答

-2
你可以使用这个:
@Override

 public boolean shouldOverrideUrlLoading(WebView view, String url) {

                // Here put your code
                Map<String, String> map = new HashMap<String, String>();
                map.put("Content-Type","application/json");
                view.loadUrl(url, map);
                return false;

            }

3
这只是不断重新加载网址,是吗? - Carlo Moretti
@CarloMoretti 不,它并没有。但它也无论如何没有回答到原帖的问题。 - undefined

-3

我遇到了同样的问题并解决了。

如前所述,您需要创建自定义的WebViewClient并覆盖shouldInterceptRequest方法。

WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)

该方法应该在返回一个“空”的WebResourceResponse的同时发出webView.loadUrl。

就像这样:

@Override
public boolean shouldInterceptRequest(WebView view, WebResourceRequest request) {

    // Check for "recursive request" (are yor header set?)
    if (request.getRequestHeaders().containsKey("Your Header"))
        return null;

    // Add here your headers (could be good to import original request header here!!!)
    Map<String, String> customHeaders = new HashMap<String, String>();
    customHeaders.put("Your Header","Your Header Value");
    view.loadUrl(url, customHeaders);

    return new WebResourceResponse("", "", null);
}

从这个方法调用view.loadUrl似乎会导致应用程序崩溃。 - willcwf
@willcwf 你有这个崩溃的例子吗? - Francesco
@Francesco 我的应用程序也崩溃了。 - Giacomo M
1
所有人都在踩这个帖子,说它崩溃了并没有什么帮助。请更具体地描述问题,写下一些错误信息。 - Francesco

-19

使用这个:

webView.getSettings().setUserAgentString("User-Agent");

14
这并没有回答问题。 - younes0
这与授权头不同。 - Vlad
请再次阅读问题。 - nasser

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