从Android Webview添加自定义标头

5
我需要为来自WebView的每个请求添加自定义标头。我知道loadURL有添加额外标头的参数,但这些仅适用于某些请求。 所有(与资源相关的)请求都不包含标头。 我已查看了WebViewClient中的所有重写,但没有任何方法可以添加资源请求的标头-onLoadResource(WebView view, String url)shouldInterceptRequest(Webview,url)。任何帮助都将是美好的。
1个回答

9

shouldInterceptRequest(Webview,url)可以帮助你拦截网站的每一个请求,例如JavaScript、CSS、图片。然后在shouldInterceptRequest(Webview,url)内部,你可以使用参数url通过使用HttpClientHttpPOST来初始化新的http请求,以下是示例代码:

DefaultHttpClient client = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(<"your url for each request">);
httpPost.setHeader("<header-name>", "<header-value>");
HttpReponse httpResponse = client.execute(httpPost);

//here omit getting content-type and encoding

InputStream reponseInputStream = httpReponse.getEntity().getContent();

那么你可以将 responseInputStream 放到 return WebResourceResponse(<content-type>, <encoding>, reponseInputStream) 中,在 shouldInterceptRequest(Webview,url) 中使用。

如果您有任何不需要添加更多头的请求,只需过滤它并返回 nullshouldInterceptRequest(Webview,url) 将完成其余操作。

希望这能帮助到您。


我们正在开发一个浏览器,它会向代理发送请求,代理再将数据发送回浏览器。因此,每个请求都应该带有自定义标头并从代理显示页面。在这种情况下,如何仅拦截与资源相关的请求?资源类型很多,例如CSS、JS、PNG、JPEG等等...那么我该如何处理呢? - Gopichand
仅限于资源相关的请求,我想你不想在网页本身添加头部,你可以在ShouldInterceptRequest()中使用请求的内容类型进行过滤,除了"text/html"之外的其他类型。 - admar.kevin
我怎样可以从请求中获取 content-type?据我所知,我们只能从响应中获取。 - Gopichand
请查看这里。使用httpResponse.getEntity()获取HttpEntity - admar.kevin
shouldInterceptRequest()方法不会针对重复的资源URL调用,因此无法添加自定义标头。例如,第一次调用url1时,应调用shouldInterceptRequest()方法,但第二次调用url1时,shouldInterceptRequest()方法不会被调用。 - saurav
显示剩余2条评论

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