通过在shouldInterceptRequest中向WebResourceRequest的标头添加标头来向WebView添加自定义标头不起作用

时间:2016-07-16 16:04:08

标签: android android-webview

我需要为WebView中的页面加载添加自定义标题,但它不起作用,标题未设置:

@Override
public WebResourceResponse shouldInterceptRequest (WebView view,  WebResourceRequest request)
{
    request.getRequestHeaders().add("MyHeader","MyValue"); 
    return super.shouldInterceptRequest(view, request);
}

我在这里做错了什么?我在Android 5上运行。

我在SO上看到很多答案,说你必须自己做HTTP请求并返回WebResourceResponse。这是因为即使你像我一样修改标题,它们也会被忽略吗?

我还试图在Android源代码中找到该位置的调用 调用shouldInterceptRequest的位置在哪里,所以我可以看到它是如何工作的,但是我找不到它。

3 个答案:

答案 0 :(得分:5)

我自己找到了答案,它正好在docs

  

如果返回值为null,则WebView将继续加载   像往常一样资源。否则,返回响应和数据将是   使用

此外,一个简单的测试显示WebViewClient.shouldInterceptRequest的基本实现返回null。因此,WebView基本上继续像往常一样加载资源。

换句话说,我不能只为标题添加一个值并期望它被使用。 我实际上需要自己做请求并返回响应。

太糟糕了,没有办法只修改标头并让默认实现使用它。

我知道我可以通过使用标题调用loadUrl方法来设置标题,但如果我首先加载本地页面然后加载在线页面,则不会使用标题。

答案 1 :(得分:1)

WebViewClient中提供的shouldInterceptRequest的默认方法实现返回null,因此如果我们需要设置其他标头,那么我们必须创建WebResourceResponse并将其返回。

https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/webkit/WebViewClient.java

答案 2 :(得分:0)

我能够在我的一个 shouldInterceptRequest 处理程序中使用此代码向 响应 添加自定义标头:

InputStream is = new ByteArrayInputStream(result.getBytes());
WebResourceResponse resp = new WebResourceResponse("text/html", null, is);
Map<String, String> hdrs = resp.getResponseHeaders();
Map<String, String> newHdrs = new HashMap<>();
if(hdrs != null) newHdrs.putAll(hdrs);
newHdrs.put("Access-Control-Allow-Origin", "*");
resp.setResponseHeaders(newHdrs);
return resp;

请注意,这是原始帖子发布 5 年后,我正在编写 API 30