Xamarin.Forms Android WebView ShouldOverrideUrlLoading获取RequestHeaders为null问题
问题原因
Android 系统原生设计中,ShouldOverrideUrlLoading 回调返回的 IWebResourceRequest 实例的 RequestHeaders 属性默认返回 null,这不是配置错误导致的:
- 只有资源加载类回调
ShouldInterceptRequest中,该属性才会被系统赋值 - 你通过
LoadUrl传入的自定义请求头已经被 WebView 底层接收并发送给服务端,只是没有被回传到ShouldOverrideUrlLoading的参数中
解决方案
方案1:直接读取本地存储的自定义头
你添加的是固定的应用版本自定义头,不需要从请求中取,直接在 ShouldOverrideUrlLoading 中访问你定义的 Constants.AppVersion 即可,或者在添加请求头时将自定义头存入全局可访问的静态变量/服务,需要时直接读取即可,兼容性最好。
方案2:强制转换为原生对象读取
和iOS的强制转型逻辑一致,将跨平台封装的 IWebResourceRequest 转为安卓原生 WebResourceRequest 即可读取请求头,注意该方法存在ROM兼容性风险,部分定制系统可能无法获取:
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView webView, IWebResourceRequest request) { if (request is Android.Webkit.WebResourceRequest nativeRequest) { var headers = nativeRequest.RequestHeaders; // 此处处理请求头逻辑 } // 原有逻辑 return base.ShouldOverrideUrlLoading(webView, request); }
方案3:换用ShouldInterceptRequest回调处理
如果需要获取所有请求的完整请求头,改用资源拦截回调即可,该回调的参数中RequestHeaders默认有值:
public override WebResourceResponse ShouldInterceptRequest(Android.Webkit.WebView view, IWebResourceRequest request) { var headers = request.RequestHeaders; // 处理请求头逻辑 return base.ShouldInterceptRequest(view, request); }
注意事项
如果是WebView内部3xx跳转触发的ShouldOverrideUrlLoading,即使转成原生对象请求头也可能为空,这是安卓系统底层限制,没有修复方案,建议优先使用方案1处理自定义请求头的读取。
内容的提问来源于stack exchange,提问作者Gleasonator
相关产品推荐
相关产品推荐

