我需要为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的位置在哪里,所以我可以看到它是如何工作的,但是我找不到它。
答案 0 :(得分:5)
我自己找到了答案,它正好在docs:
如果返回值为null,则WebView将继续加载 像往常一样资源。否则,返回响应和数据将是 使用
此外,一个简单的测试显示WebViewClient.shouldInterceptRequest
的基本实现返回null
。因此,WebView基本上继续像往常一样加载资源。
换句话说,我不能只为标题添加一个值并期望它被使用。 我实际上需要自己做请求并返回响应。
太糟糕了,没有办法只修改标头并让默认实现使用它。
我知道我可以通过使用标题调用loadUrl
方法来设置标题,但如果我首先加载本地页面然后加载在线页面,则不会使用标题。
答案 1 :(得分:1)
WebViewClient中提供的shouldInterceptRequest
的默认方法实现返回null,因此如果我们需要设置其他标头,那么我们必须创建WebResourceResponse并将其返回。
答案 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