【问题标题】:How to update request header in WebView如何在 WebView 中更新请求标头
【发布时间】:2019-12-08 15:08:09
【问题描述】:

我正在尝试从 android WebView 访问 URL。在加载 URL 时,我通过 chrome 检查了一个标头值为 null(请参见下图)。

我的问题是,我想更新 Origin 值。我该怎么做?

注意:如果 Origin 有空值,我只需要更新,否则我必须按原样加载

【问题讨论】:

标签: android webview http-headers


【解决方案1】:

对于更改请求标头,您可以使用 hashmap 并添加标头键值对

WebView web = findViewById(R.id.webView);

private Map<String, String> getHeaders() {
    Map <String, String> extraHeaders = new HashMap<String, String>();
    extraHeaders.put("Authorization", "Bearer"); 
    return headers;
}

下一步需要创建WebViewClient:

private WebViewClient getWebViewClient() {
    return new WebViewClient() {

    @Override
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        view.loadUrl(request.getUrl().toString(), getHeaders());
        return true;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url, getHeaders());
        return true;
    }
};
}

将 WebViewClient 添加到您的 WebView:

web.setWebViewClient(getWebViewClient());

【讨论】:

  • 嗨 Alireza,感谢您的帮助。但它不起作用:-(
  • 嗨,Bahu,欢迎您,希望您能找到答案
【解决方案2】:
    webView = (WebView) findViewById(R.id.webView);
    progressBar = (ProgressBar) findViewById(R.id.progressBar);

    webView.getSettings().setJavaScriptEnabled(true);
    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
            progressBar.setProgress(progress);
            if (progress == 100) {
                progressBar.setVisibility(View.GONE);
            }
        }
    });




    HashMap<String, String> headers=new HashMap<>();

    webView.loadUrl("https://stackoverflow.com",headers);

【讨论】:

  • 让我知道这个问题,因为我正在做同样的事情,它在我最后的工作很好
【解决方案3】:

您可以使用

向 webview 提供额外的 http 标头

public void loadUrl (字符串 url, 映射额外的HttpHeaders)

additionalHttpHeaders Map:要在 此 URL 的 HTTP 请求,指定为从名称到值的映射。笔记 如果此地图包含默认设置的任何标题 通过这个 WebView,例如那些控制缓存、接受类型或 用户代理,它们的值可能会被此 WebView 覆盖 默认值。

在您的情况下,web 视图默认 http 标头会覆盖源。

【讨论】:

    【解决方案4】:

    您可以创建自定义WebViewClient 并覆盖shouldInterceptRequest() 方法。如果您以 API 21 及更高版本为目标,则为

    override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse?
    

    在里面,你会打开一个 HTTPS 连接:

    val requestUrl = request.url!!.toString()
    val httpsUrl = URL(requestUrl)
    val conn: HttpsURLConnection = httpsUrl.openConnection() as HttpsURLConnection
    for ((key, value) in request.requestHeaders) {
      conn.addRequestProperty(key, value)
    }
    

    现在您有机会添加新标题或修改现有标题,例如

    conn.setRequestProperty("ORIGIN", "https://stackoverflow.com")
    

    当您的请求全部设置好后,您可以将结果包装在一个新的 WebResourceResponse 中:

    return WebResourceResponse(
      conn.contentType.substringBefore(";"), 
      conn.contentType.substringAfter("charset=", "UTF-8"), 
      conn.inputStream)
    

    典型的conn.contentType"text/html; charset=UTF-8"。您可以添加更具弹性的解析,或者如果您知道硬编码值,则只需使用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 2022-11-10
      • 2018-09-30
      • 2022-01-09
      相关资源
      最近更新 更多