Я работаю над проектом, в котором мы заинтересованы в перехвате некоторого HTTP-трафика из WebView, затем добавим некоторые дополнительные заголовки к запросам, а затем вернемся назад и отобразим его в WebView.Webview показывает только текст HTML на некоторых страницах
Для этого мы используем метод shouldInterceptRequest (WebView view, String URL), который возвращает WebResourceResponse, который должен отображать веб-просмотр.
Вот что я делаю:
private WebResourceResponse handleRequest(String url){
Log.d(TAG, "Intercepting request at : " + url);
HttpURLConnection connection = null;
URL serverAddress = null;
WebResourceResponse response = null;
InputStream is = null;
String type = null;
String encoding = null;
int statusCode;
int length;
try
{
//Set up the initial connection
serverAddress = new URL(url);
connection = (HttpURLConnection)serverAddress.openConnection();
// Initiate a HEAD request to get meta data
connection.setRequestMethod("HEAD");
// Let the WebView handle requests with no headers in them.
Map<String, List<String>> headers = connection.getHeaderFields();
if(headers == null){
Log.d(TAG, "Retrieved response with zero headers at: " + url);
return null;
}
statusCode = connection.getResponseCode();
if(statusCode == 200){
// OK, delegate request if content length is large enough
type = connection.getContentType();
encoding = connection.getContentEncoding();
length = connection.getContentLength();
Log.d(TAG, "ContentType = " + type + " encoding = " + encoding + " " + url);
connection.disconnect();
if(length > SIZE_THRESHOLD){
// send to other device
Log.d(TAG, "Delegating request to other device NOT IMPLEMENTED");
// TODO: Currently just handling them locally.
}
else{
connection = (HttpURLConnection)serverAddress.openConnection();
connection.setRequestMethod("GET");
is = connection.getInputStream();
statusCode = connection.getResponseCode();
type = connection.getContentType();
encoding = connection.getContentEncoding();
Log.d(TAG, "Done Loading " + url);
return new WebResourceResponse(type, encoding, is);
}
}
}
catch (MalformedURLException e) {
e.printStackTrace();
}
catch (ProtocolException e) {
e.printStackTrace();
}
catch (IOException e) {
Log.d(TAG, "IOException when connection to : " + url + " Stacktrace: " + Log.getStackTraceString(e));
}
return response;
}
При попытке загрузить страницу как «www.madopskrifter.nu» или «www.newz.dk», то я получаю все содержимое просто отлично с фотографиями и все. Однако, если я просматриваю страницы, такие как stackoverflow, я просто получаю индексный файл HTML на stackoverflow.com. То же самое для youtube.com. (У меня включен JavaScript в настройках WebView)
Есть что-то, что мне не хватает? на данный момент я даже не добавляю свои собственные заголовки или что-то еще, я просто возвращаю тот же ответ, за исключением того, что я получаю их «вручную». (Также я не обрабатываю запросы с нулевыми заголовками прямо сейчас, но даже если я прокомментирую этот код, тогда проблема все еще существует).
Любая помощь будет принята с благодарностью,
Спасибо, что спас мой день! – mivola