You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView中如何为URL传递请求头?已尝试代码未生效

Android WebView 为指定URL添加请求头无效的解决方案

看起来你目前的WebViewClient实现里缺少了主动添加请求头的核心逻辑,所以才会出现请求头没生效的情况。我来给你梳理下正确的实现方式:

1. 首次加载URL时直接附带请求头

当你第一次加载目标URL时,直接使用loadUrl的重载方法,传入请求头Map:

// 构建请求头
Map<String, String> customHeaders = new HashMap<>();
customHeaders.put("X-Custom-Header", "Your-Header-Value"); // 替换成你的头键值对

// 带请求头加载目标URL
webView.loadUrl("https://your-target-domain.com", customHeaders);

2. 处理页面内跳转/资源请求,确保后续请求也带指定头

如果页面内有跳转(比如点击链接打开同域名的其他页面),或者页面加载的静态资源(JS/CSS/图片)也需要这个请求头,你需要在WebViewClient里拦截请求,重新添加头:

WebViewClient webViewClient = new WebViewClient() {
    // 处理API 21+的所有资源请求(包括页面跳转、静态资源加载)
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        String targetUrl = request.getUrl().toString();
        
        // 判断当前请求是否属于需要添加头的URL范围(可以用contains、startsWith或者正则匹配)
        if (targetUrl.startsWith("https://your-target-domain.com")) {
            try {
                // 重新构建请求并添加头
                URLConnection connection = new URL(targetUrl).openConnection();
                connection.setRequestProperty("X-Custom-Header", "Your-Header-Value");
                
                // 返回处理后的资源响应
                return new WebResourceResponse(
                        connection.getContentType(),
                        connection.getContentEncoding(),
                        connection.getInputStream()
                );
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return super.shouldInterceptRequest(view, request);
    }

    // 处理页面跳转(兼容旧版本API,也可以用来拦截主页面跳转)
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String targetUrl = request.getUrl().toString();
        if (targetUrl.startsWith("https://your-target-domain.com")) {
            Map<String, String> headers = new HashMap<>();
            headers.put("X-Custom-Header", "Your-Header-Value");
            view.loadUrl(targetUrl, headers);
            return true; // 拦截默认加载逻辑,使用我们带请求头的方式加载
        }
        return super.shouldOverrideUrlLoading(view, request);
    }

    // 保留你原来的进度对话框逻辑
    @Override
    public void onPageFinished(WebView view, String url) {
        if (progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        super.onPageFinished(view, url);
    }
};

// 给WebView设置这个自定义的WebViewClient
webView.setWebViewClient(webViewClient);

几个关键注意点

  • 请确保请求头的键名和值没有拼写错误,很多时候无效都是因为拼写问题
  • 如果是Cookie类的请求头,建议用CookieManager来设置,而不是直接放在headers里,比如:
    CookieManager.getInstance().setCookie("your-target-domain.com", "cookieName=cookieValue");
    
  • 可以用抓包工具(比如Charles、Fiddler)验证请求头是否真的被带上,这是排查问题最直接的方式
  • 对于HTTPS链接,确保你的WebView没有禁用HTTPS支持(默认是支持的,除非你自定义了WebView的SSL配置)

内容的提问来源于stack exchange,提问作者Siddhesh Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:36:26