我尝试使用以下方法拦截 webview 请求:ShouldInterceptRequest
,里面我用了HttpUrlConnection
为了从服务器获取数据,我将其设置为遵循重定向,这对 webviewclient 是透明的。这意味着当我返回 WebResponseResource("", "", data_inputstream) 时,webview 可能不知道目标主机已更改。我如何告诉网络视图发生了这种情况?
ourBrowser.setWebViewClient(new WebViewClient() {
@Override
public WebResourceResponse shouldInterceptRequest(WebView view,
String url) {
..... //some code omitted here
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) newUrl.openConnection();
conn.setFollowRedirects(true);
} catch (IOException e) {
e.printStackTrace();
}
..... //
InputStream is = null;
try {
is = conn.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return new WebResourceResponse(mimeType, encoding, is);
}
}
如果我请求“google.com”,它应该被重定向到“google.co.uk”,但是如果附加“co.uk”的css文件的链接是“/render/something.css”,则webview不知道重定向”,webview仍然转到“http://www.google.com/render/something.css http://www.google.com/render/something.css“找到应该是的css文件”http://www.google.co.uk/render/something.css http://www.google.co.uk/render/something.css".
有人可以帮助我吗?
某些元数据(url、标头等)无法由WebResourceResponse
班级。这意味着您只能使用shouldInterceptRequest
提供不同的数据(更改页面的内容),但您不能使用它来更改加载的 URL。
在您的情况下,您正在使用重定向HttpUrlConnection
,所以 WebView 仍然认为它正在加载”http://www.google.com/ http://www.google.com/”(即使内容来自“http://google.co.uk/ http://google.co.uk/”)。如果 Google 的主页没有显式设置基本 URL,WebView 将继续假定基本 URL 为“http://www.google.com/ http://www.google.com/“(因为它没有看到重定向)。由于相对资源引用(例如<link href="//render/something.css" />
)根据baseURL(在本例中为“http://www.google.com/ http://www.google.com/“ 并不是 ”http://www.google.co.uk/ http://www.google.co.uk/”)你得到了你观察到的结果。
你能做的就是使用HttpUrlConnection
确定您要加载的 URL 是否是重定向并返回null
在这种情况下。但是我强烈建议不要使用HttpUrlConnection
from shouldInterceptRequest
一般来说 - WebView 的网络堆栈效率更高,并且将并行执行获取(而使用shouldInterceptRequest
将序列化 KK 之前的 WebView 中的所有负载)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)