.NET Maui中使用RestSharp发起API请求遇Android端Bad Request问题
问题分析与解决方案
Bad Request(400)错误本质是请求不符合API的格式要求,Windows正常但Android出错,大概率是跨平台的参数格式化差异导致,而非RestSharp与.NET Maui Android的兼容问题,以下是具体排查和修复步骤:
1. 优先修复经纬度的格式化问题
Windows和Android的系统区域设置可能不同,比如部分地区默认用逗号作为小数点分隔符,这会导致latitude和longitude的字符串格式变成40,7128而非40.7128,最终ll参数格式不符合Foursquare API要求(正确格式应为纬度.xx,经度.yy)。
修改代码,强制使用不变文化格式化数值:
using RestSharp; using System.Globalization; // 需添加此引用 namespace FindPlacesApp.Code.ApiRequests { public class SearchPlacesRequest { public async Task<string> GetPlaces(double latitude, double longitude, int radius) { try { var options = new RestClientOptions("https://api.foursquare.com/v3/places/search"); var client = new RestClient(options); var request = new RestRequest(); request.AddHeader("Accept", "application/json"); request.AddHeader("Authorization", Constants.apiKey); // 用不变文化格式化,避免区域设置影响 var llParam = $"{latitude.ToString(CultureInfo.InvariantCulture)},{longitude.ToString(CultureInfo.InvariantCulture)}"; request.AddQueryParameter("ll", llParam); request.AddQueryParameter("radius", radius.ToString(CultureInfo.InvariantCulture)); var response = await client.GetAsync(request); // 关键:打印错误响应内容,API会明确说明错误原因 if (!response.IsSuccessStatusCode) { var errorMsg = $"Unsuccess: {response.StatusCode}\n{response.Content}"; await AlertDisplayer.DisplayError(errorMsg); } return response.Content; } catch (Exception ex) { await AlertDisplayer.DisplayError($"Exception: {ex}"); } return string.Empty; } } }
2. 额外排查点
- 确认
Constants.apiKey在Android环境中正确加载:比如是否存在资源文件读取差异,可在代码中添加日志打印apiKey的内容验证。 - 检查请求的完整URL:在Android中打印
client.BuildUri(request)的结果,对比Windows环境下的URL是否一致,重点看参数部分的格式。
3. 为什么Windows正常?
Windows开发环境的区域设置通常使用点作为小数点,所以直接拼接字符串不会出问题;而Android设备如果使用非英语区域(比如欧洲部分地区),默认会用逗号作为小数点,导致参数格式错误。
内容的提问来源于stack exchange,提问作者Vitaliy
相关产品推荐
相关产品推荐

