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

MAUI中HttpClient SendAsync与Xamarin行为不一致问题排查

解决MAUI中GET请求带JSON Body调用WordPress API返回403的问题

问题根源

HTTP规范中不推荐GET请求携带请求体,虽部分服务器允许该做法,但不同平台HttpClient的底层实现存在差异:Xamarin中的HttpClient可正常发送带Body的GET请求,而MAUI在Android API 33上依赖的OkHttp对这类请求的处理逻辑更严格,导致WordPress REST API误将其识别为POST创建请求,返回403错误。

正确解决方案:将参数转为URL查询参数

WordPress REST API支持通过URL查询参数传递筛选条件,这是符合HTTP规范的标准做法,替换原带Body的GET请求即可解决问题。

修改后的代码如下:

// 保留原有HttpClient初始化逻辑不变
var clientHandler = new HttpClientHandler()
{
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
};

httpClient = new HttpClient(clientHandler)
{
    Timeout = TimeSpan.FromMilliseconds(timeOut)
};
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(MediaTypeNames.Application.Json));
httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");

// 修改后的Get方法:将对象参数转为URL查询字符串
public async Task<string> Get<T>(T item, string path, bool https = false)
{
    // 将对象非空属性转为URL查询参数
    var queryParams = ObjectToQueryString(item);
    var requestMethod = https ? "https://" : "http://";
    var serverString = $"{requestMethod}{path}{(string.IsNullOrEmpty(queryParams) ? "" : $"?{queryParams}")}";

    // 发送标准GET请求
    HttpResponseMessage response = await httpClient.GetAsync(serverString);
    var json = await response.Content.ReadAsStringAsync();
    response.Dispose();
    return json;
}

// 辅助方法:将对象转为URL编码的查询字符串
private string ObjectToQueryString<T>(T obj)
{
    var properties = typeof(T).GetProperties()
        .Where(p => p.GetValue(obj) != null)
        .Select(p => $"{Uri.EscapeDataString(p.Name)}={Uri.EscapeDataString(p.GetValue(obj).ToString())}");
    return string.Join("&", properties);
}

关键说明

  • 辅助方法ObjectToQueryString会自动将对象非空属性转为key=value格式的查询参数,并处理URL编码,避免参数解析错误
  • 修改后的请求URL示例:https://[website_address]/wp-json/wp/v2/posts?context=view&page=1&per_page=100&order=desc&orderby=date&status=publish&sticky=False
  • 该方式完全符合HTTP规范,不会触发WordPress API的请求类型误判

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:07:45