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

如何获取WebView加载的资源列表(含URL、响应码及缓存状态)

如何获取WebView加载的远程资源详情(含URL、响应状态、缓存状态)

Android 实现方案

通过自定义WebViewClient拦截资源请求与响应,捕获所需信息:

  • 重写shouldInterceptRequest记录请求URL
  • 重写onReceivedResponse获取成功响应的状态码,通过响应头判断缓存状态
  • 重写onReceivedHttpError捕获加载错误的状态码与信息

代码示例

public class DebugWebViewClient extends WebViewClient {
    private final List<ResourceInfo> resourceList = new ArrayList<>();

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        return super.shouldInterceptRequest(view, request);
    }

    @Override
    public void onReceivedResponse(WebView view, WebResourceRequest request, WebResourceResponse response) {
        super.onReceivedResponse(view, request);
        String url = request.getUrl().toString();
        int statusCode = response.getStatusCode();
        
        // 判断缓存状态:基于响应头和请求头的缓存标识
        boolean isCached = false;
        Map<String, String> responseHeaders = response.getResponseHeaders();
        if (responseHeaders != null) {
            String cacheControl = responseHeaders.get("Cache-Control");
            String requestIfNoneMatch = request.getRequestHeaders().get("If-None-Match");
            String responseETag = responseHeaders.get("ETag");
            
            isCached = (cacheControl != null && !cacheControl.contains("no-cache")) 
                    || (requestIfNoneMatch != null && requestIfNoneMatch.equals(responseETag));
        }
        
        resourceList.add(new ResourceInfo(url, String.valueOf(statusCode), isCached, null));
    }

    @Override
    public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
        super.onReceivedHttpError(view, request, errorResponse);
        String url = request.getUrl().toString();
        int errorCode = errorResponse.getStatusCode();
        String errorMsg = errorResponse.getReasonPhrase();
        
        resourceList.add(new ResourceInfo(url, String.valueOf(errorCode), false, errorMsg));
    }

    // 存储资源信息的数据类
    public static class ResourceInfo {
        public String url;
        public String status;
        public boolean isCached;
        public String errorMsg;

        public ResourceInfo(String url, String status, boolean isCached, String errorMsg) {
            this.url = url;
            this.status = status;
            this.isCached = isCached;
            this.errorMsg = errorMsg;
        }
    }

    // 获取完整资源列表
    public List<ResourceInfo> getResourceList() {
        return resourceList;
    }
}

iOS 实现方案

使用WKWebView的WKNavigationDelegate回调捕获资源请求、响应与错误,结合NSURLCache判断缓存状态:

  • webView(_:decidePolicyFor:decisionHandler:)放行请求并记录URL
  • webView(_:didReceive:for:)获取响应状态码,通过URLCache检查缓存存在性
  • webView(_:didFail:withError:)捕获加载错误信息

代码示例

import WebKit

class DebugWebViewDelegate: NSObject, WKNavigationDelegate {
    var resourceList: [ResourceInfo] = []

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        decisionHandler(.allow)
    }

    func webView(_ webView: WKWebView, didReceive response: URLResponse, for navigation: WKNavigation!) {
        guard let urlStr = response.url?.absoluteString, 
              let httpResponse = response as? HTTPURLResponse else { return }
        
        let statusCode = httpResponse.statusCode
        // 检查是否命中缓存
        let request = URLRequest(url: URL(string: urlStr)!)
        let isCached = URLCache.shared.cachedResponse(for: request) != nil
        
        resourceList.append(ResourceInfo(url: urlStr, status: "\(statusCode)", isCached: isCached, errorMsg: nil))
    }

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        guard let url = error.userInfo[NSURLErrorFailingURLErrorKey] as? URL else { return }
        resourceList.append(ResourceInfo(url: url.absoluteString, status: "加载失败", isCached: false, errorMsg: error.localizedDescription))
    }

    // 存储资源信息的模型
    struct ResourceInfo {
        let url: String
        let status: String
        let isCached: Bool
        let errorMsg: String?
    }
}

快速调试替代方案

直接启用WebView远程调试,无需自定义代码即可查看资源列表:

  • Android:在Application初始化时调用WebView.setWebContentsDebuggingEnabled(true),然后用Chrome浏览器通过chrome://inspect连接设备查看
  • iOS:在设备设置中开启Safari > 高级 > Web检查器,用Mac端Safari的开发菜单连接设备查看

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:45:27