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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:50:33