Xamarin WebViewClient添加自定义请求头的可行方案咨询
为Xamarin Android WebViewClient的所有请求添加自定义请求头
问题背景
直接修改IWebResourceRequest的请求头集合无法生效,仅基于HttpClient拦截GET请求的方案也无法适配带请求体的POST/PUT等请求,核心原因是未处理请求体的获取与转发逻辑。
可靠实现方案
通过结合OkHttp处理请求代理,同时利用Android API获取请求体,可支持所有请求方法:
1. 引入依赖
添加Square.OkHttp3 NuGet包,适配Android平台的网络请求处理。
2. 重写WebViewClient的ShouldInterceptRequest方法
using OkHttp3; using Android.Webkit; using System; using System.IO; public class CustomWebViewClient : WebViewClient { private readonly OkHttpClient _httpClient = new OkHttpClient(); public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest request) { // 构建请求Builder,复制原请求的方法和地址 var requestBuilder = new Request.Builder() .Url(request.Url.ToString()) .Method(request.Method, GetRequestBody(request)); // 复制原请求的所有头信息 foreach (var header in request.RequestHeaders) { requestBuilder.AddHeader(header.Key, header.Value); } // 添加自定义请求头 requestBuilder.AddHeader("X-LPPTAgent", "your-custom-value"); // 同步发送请求(可添加超时配置避免ANR) using var response = _httpClient.NewCall(requestBuilder.Build()).Execute(); // 解析响应并构建WebResourceResponse返回给WebView string contentType = response.Header("Content-Type"); string charset = response.Header("Content-Encoding") ?? "UTF-8"; return new WebResourceResponse( contentType, charset, (int)response.Code(), response.Message(), response.Headers().ToMultimap(), response.Body().ByteStream() ); } private RequestBody GetRequestBody(IWebResourceRequest request) { // 仅处理带请求体的POST/PUT等非GET方法 if (!request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase)) { var bodyStream = request.GetBody(); if (bodyStream != null && bodyStream.Available() > 0) { // 读取请求体内容 byte[] bodyBytes = new byte[bodyStream.Available()]; bodyStream.Read(bodyBytes); bodyStream.Close(); // 获取原请求的Content-Type string contentType = request.RequestHeaders.Get("Content-Type") ?? "application/octet-stream"; return RequestBody.Create(MediaType.Parse(contentType), bodyBytes); } } // 无请求体时返回空RequestBody return RequestBody.Create(null, Array.Empty<byte>()); } }
关键说明
request.GetBody()仅支持Android 5.0(API 21)及以上版本,若需兼容更低版本,需通过JS注入或其他方式额外处理请求体- 可在OkHttpClient初始化时添加超时配置(如
.ConnectTimeout(10, TimeUnit.Seconds)),避免同步请求引发ANR - 原请求的所有头信息会被完整复制,避免丢失必要的请求参数
内容的提问来源于stack exchange,提问作者ane
相关产品推荐
相关产品推荐

