如何获取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:)放行请求并记录URLwebView(_: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
相关产品推荐
相关产品推荐

