Android WebView иногда не отправляет заголовки запроса при начальной загрузке страницы - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть активность веб-просмотра, которая загружает URL с несколькими пользовательскими заголовками запросов в методе onCreate ().Требуется передать пользовательские заголовки с начальным запросом URL.На некоторых устройствах веб-просмотр перестает отправлять заголовки после нескольких попыток веб-просмотра.

Например, у меня есть HomeActivity, которое запускает WebViewActivity.После запуска WebViewActivity и перехода обратно к HomeActivity несколько раз, WebViewActivity прекращает отправку пользовательских заголовков запроса, и это поведение не изменится, пока я не очищу данные приложения.

Я подтвердил это поведение с помощью инструмента MITM,Реализация выглядит следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {

    Map<String, String> map = new HashMap<>();
    map.put("header1", "header1_value");
    map.put("header2", "header2_value");
    map.put("header3", "header3_value");
    map.put("header4", "header4_value");
    webView.loadUrl("https://www.example.com/mypath", map);

}

Приведенный выше фрагмент кода выполняется безоговорочно при каждом запуске действия.Тем не менее, заголовки не присутствуют в фактическом запросе веб-просмотра.Кроме того, запрашиваемая страница является перенаправлением 303.

1 Ответ

0 голосов
/ 08 марта 2019

Если ваша минимальная цель API - уровень 21 , вы можете использовать shouldInterceptRequest , иначе вы можете использовать this

При каждом перехвате,вам нужно будет взять URL, сделать этот запрос самостоятельно и вернуть поток контента:

Затем:

WebViewClient wvc = new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

        try {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            httpGet.setHeader("header1", "header1_value");
            httpGet.setHeader("header2", "header2_value");
            httpGet.setHeader("header3", "header3_value");
            httpGet.setHeader("header4", "header4_value");
            HttpResponse httpReponse = client.execute(httpGet);

            Header contentType = httpReponse.getEntity().getContentType();
            Header encoding = httpReponse.getEntity().getContentEncoding();
            InputStream responseInputStream = httpReponse.getEntity().getContent();

            String contentTypeValue = null;
            String encodingValue = null;
            if (contentType != null) {
                contentTypeValue = contentType.getValue();
            }
            if (encoding != null) {
                encodingValue = encoding.getValue();
            }
            return new WebResourceResponse(contentTypeValue, encodingValue, responseInputStream);
        } catch (ClientProtocolException e) {
            //return null to tell WebView we failed to fetch it WebView should try again.
            return null;
        } catch (IOException e) {
             //return null to tell WebView we failed to fetch it WebView should try again.
            return null;
        }
    }
}

//Where wv is your webview
wv.setWebViewClient(wvc);

На основании этого вопроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...