В Android WebView можно просматривать заголовки перед каждым запросом? - PullRequest
0 голосов
/ 23 апреля 2020

В Android, WebView - при загрузке страниц - при пользовательской навигации и авто-перенаправлениях - могу ли я просматривать заголовки перед каждым запросом?

Я просто хочу просмотреть заголовки и разрешить выполнение запроса .

Спасибо

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете создать WebViewClient для выполнения запроса с клиентом, который позволяет вам выполнять запросы и анализировать заголовки, например, Volley:

private WebViewClient getWebViewClient() {
    return new WebViewClient() {
        @Override
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public boolean shouldOverrideUrlLoading(final android.webkit.WebView view, WebResourceRequest request) {
            android.util.Log.d("Headers", "New request: " + request);
            if (request.getRequestHeaders() != null) {
                for (Map.Entry<java.lang.String, java.lang.String> entry : request.getRequestHeaders().entrySet()) {
                    android.util.Log.d("Headers", "Key = " + entry.getKey() + ", Value = " + entry.getValue());
                }
            }
            doVolleyRequest(view, request.getUrl().toString());
            return true;
        }

        @Override
        public boolean shouldOverrideUrlLoading(android.webkit.WebView view, String url) {
            android.util.Log.d("Headers", "New url: " + url);
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            Log.d("onPageStarted", url);
        }
    };
}

private void doVolleyRequest(final WebView webView, String url) {
    StringRequest getRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // response
                    Log.d("Response", response);
                    webView.loadDataWithBaseURL(null, response, "text/html", "utf-8", null);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.d("Error.Response", error.getLocalizedMessage());
                }
            }
    ) {
        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            Map<String, String> responseHeaders = response.headers;
            if (responseHeaders != null) {
                for (Map.Entry<java.lang.String, java.lang.String> entry : responseHeaders.entrySet()) {
                    android.util.Log.d("Headers", "Key = " + entry.getKey() + ", Value = " + entry.getValue());
                }
            }
            return super.parseNetworkResponse(response);
        }
    };
    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    queue.add(getRequest);
}

И назначать его веб-представлению перед загрузкой URL:

WebView webView = (WebView) findViewById(R.id.webview);
webView.setWebViewClient(getWebViewClient());
String url = "https://***********";
doVolleyRequest(webView, url); // webView.loadUrl(url);

Имейте в виду, что вам нужно добавить залп к зависимостям gradle:

implementation 'com.android.volley:volley:1.1.1'

Переопределением метода shouldOverrideUrlLoading() регистрируется заголовок запроса и назначается ответ html на веб-просмотр, чтобы веб-просмотр не выполнял саму загрузку URL.

...