如何在 WebView 中更新请求头

8

我正在尝试从Android WebView访问URL。在加载URL时,我通过Chrome进行检查,发现一个标题值为空(请参见以下图像)。

enter image description here

我的问题是,我想更新“Origin”值。我该怎么做?
注意:如果“Origin”值为空,我只需要更新其他值,否则我需要按原样加载。

请问您能否添加一些代码,演示如何在Webview中加载URL? - niks
请在此线程中查看答案: https://dev59.com/3msz5IYBdhLWcg3w3btb - mmmatey
我已经尝试过了,但是我无法更新标题。 - Bahu
4个回答

3

如果要更改请求头,您可以使用哈希映射并添加头部键值对。

原始答案:Original Answer

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
嗨Bahu,欢迎你,我希望你能找到答案。 - Alireza Tizfahm Fard

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);

请让我知道问题所在,因为我正在做同样的事情,在我的端上工作正常。 - Chirag

0

您可以使用以下方法向Webview提供额外的HTTP头信息:

public void loadUrl (String url, Map additionalHttpHeaders)

additionalHttpHeaders Map: 将要用于此URL的HTTP请求的附加标头,指定为从名称到值的映射。请注意,如果此映射包含任何由此WebView默认设置的标头,例如控制缓存、接受类型或用户代理的标头,则它们的值可能会被此WebView的默认值覆盖。

在您的情况下,原点被Webview默认的HTTP头信息所覆盖。


0
您可以创建一个自定义的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"`。如果你了解这些值,可以添加更强大的解析方式,或者直接使用硬编码的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接