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
相关产品推荐
相关产品推荐

