.NET中Google Routes API突然返回空值的问题求助
Google Routes API返回空对象{}问题排查
此前可正常从Google Routes API获取出行路线的代码,如今运行仅返回空对象{}。已确认API账单余额充足,调整多个字段后问题仍未解决,代码一个月前可正常运行,寻求问题原因。
请求代码
string routesAPIurl = "https://routes.googleapis.com/directions/v2:computeRoutes"; WebRequest request = WebRequest.Create(routesAPIurl); request.Method = "POST"; //request.Headers["Content-Type"] = "application/json"; request.ContentType = "application/json"; request.Headers["X-Goog-Api-Key"] = "***************************"; request.Headers["X-Goog-FieldMask"] = "routes.legs.steps.transitDetails"; //create transitObject TransitObject transitO = new TransitObject(); transitO.travelMode = "TRANSIT"; transitO.departureTime = DateTime.Parse("2024-04-17T09:30:00.000Z"); transitO.computeAlternativeRoutes = true; Origin trnOrigin = new Origin(); trnOrigin.address = "********"; transitO.origin = trnOrigin; Destination trnDestination = new Destination(); trnDestination.address = "********"; transitO.destination = trnDestination; TransitPreferences transitPreferences = new TransitPreferences(); transitPreferences.routingPreference = "TRANSIT_ROUTING_PREFERENCE_UNSPECIFIED"; transitPreferences.allowedTravelModes = new string[] { "LIGHT_RAIL", "BUS" }.ToList(); transitO.transitPreferences = transitPreferences; var data = Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(transitO)); request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
实体类代码
public class Destination { public string address { get; set; } } public class Origin { public string address { get; set; } } public class TransitObject { public Origin origin { get; set; } public Destination destination { get; set; } public string travelMode { get; set; } public System.DateTime departureTime { get; set; } public bool computeAlternativeRoutes { get; set; } public TransitPreferences transitPreferences { get; set; } } public class TransitPreferences { public string routingPreference { get; set; } public List<string> allowedTravelModes { get; set; } }
可能的问题原因
- 字段掩码限制过严:当前设置的
routes.legs.steps.transitDetails仅请求中转详情,若路线无符合条件的中转步骤或API返回结构中该路径不存在,就会返回空对象。可先将掩码改为routes获取完整响应,验证是否有数据返回。 - 日期序列化格式不符:
DateTime对象序列化后的格式可能不符合API要求的RFC3339标准。需检查JSON中departureTime的实际值,必要时添加序列化配置强制输出正确格式:JsonConvert.SerializeObject(transitO, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatString = "yyyy-MM-dd'T'HH:mm:ss'Z'" }) - API字段或规则变更:Google可能微调了v2版本的请求参数或响应结构,比如
allowedTravelModes枚举值、transitPreferences字段要求等,需对照官方文档核对参数正确性。 - 编码问题:使用
Encoding.ASCII可能导致含非ASCII字符的地址编码错误,建议替换为Encoding.UTF8生成请求内容。 - 地址解析失败:填写的起点/终点地址无法被API正确解析,导致无路线返回。可尝试替换为经纬度(在实体类中添加
location字段)验证是否能获取响应。
内容的提问来源于stack exchange,提问作者Ash
相关产品推荐
相关产品推荐

