Android WebView 有时不会在初始页面加载时发送请求 header

标签 android http webview header

我有一个 webview Activity ,它在其 onCreate() 方法中加载一个带有一些自定义请求 header 的 URL。要求是通过初始 URL 请求传递自定义 header 。在一些设备上,webview Activity 启动几次后,webview 停止发送 header 。

例如,我有一个启动 WebViewActivity 的 HomeActivity。在启动 WebViewActivity 并导航回 HomeActivity 几次后,WebViewActivity 停止发送自定义请求 header 并且此行为不会改变,除非我清除应用程序的数据。

我已经使用 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);

}

以上代码段在每次 Activity 启动时无条件执行。但是, header 不存在于 webview 发出的实际请求中。此外,请求的页面是 303 重定向。

最佳答案

如果您的最低 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);

基于此question

关于Android WebView 有时不会在初始页面加载时发送请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54868993/

相关文章:

android - 重建后仪器测试停止工作 : No tests found

java - 哪个java http客户端支持状态码102处理?

delphi - 从触发器下载delphi中的文件并捕获文件名

android - 键盘没有出现

android - 在 WordPress 网站更新时更新 Android App 的内容

android - 膨胀类 fragment 时出错

android - 使用 AppCompat 的 TextView 样式的父样式

web-services - 构建 HTTP 请求的工具

javascript - 使用 WebView Javascript Android 进行网站登录

android - 再次恢复应用程序时如何不重新加载webview?