.NET Core 3.1如何通过ID调用第三方API获取单台车辆数据
解决方案
问题根源
第三方Samsara API的单车辆接口响应结构和列表接口一致,都是包裹在data字段中的,但你当前的代码直接尝试将响应反序列化为SamsaraVehicle(单个车辆对象),未匹配外层的data容器;同时你定义的SamsaraSingleVehicle中Data是集合类型,不符合单车辆接口返回的单个对象结构,另外SamsaraVehicle缺少列表模型中的CreatedAtTime和UpdatedAtTime字段,可能导致反序列化不完全。
修改步骤
1. 修正单车辆响应模型
将SamsaraSingleVehicle的Data类型从集合改为单个SamsaraVehicle,同时补全SamsaraVehicle的缺失字段:
public class SamsaraVehicle { [JsonPropertyName("id")] public string Id { get; set; } [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("vin")] public string Vin { get; set; } [JsonPropertyName("serial")] public string Serial { get; set; } [JsonPropertyName("make")] public string Make { get; set; } [JsonPropertyName("model")] public string Model { get; set; } [JsonPropertyName("year")] public string Year { get; set; } [JsonPropertyName("harshAccelerationSettingType")] public string HarshAccelerationSettingType { get; set; } [JsonPropertyName("notes")] public string Notes { get; set; } [JsonPropertyName("licensePlate")] public string LicensePlate { get; set; } [JsonPropertyName("externalIds")] public ExternalIds ExternalIds { get; set; } [JsonPropertyName("gateway")] public Gateway Gateway { get; set; } [JsonPropertyName("vehicleRegulationMode")] public string VehicleRegulationMode { get; set; } // 补全缺失的时间字段 [JsonPropertyName("createdAtTime")] public DateTime CreatedAtTime { get; set; } [JsonPropertyName("updatedAtTime")] public DateTime UpdatedAtTime { get; set; } } public class SamsaraSingleVehicle { [JsonPropertyName("data")] public SamsaraVehicle Data { get; set; } // 改为单个对象,而非集合 }
2. 调整GetVehicleById方法
修改方法以匹配正确的响应结构,反序列化为SamsaraSingleVehicle后返回内部的车辆对象:
public async Task<SamsaraVehicle> GetVehicleById(string id) { try { var result = await _client.GetAsync($"fleet/vehicles/{id}"); if (result.IsSuccessStatusCode) { var response = await result.Content.ReadAsAsync<SamsaraSingleVehicle>(); return response.Data; } else { // 可选:添加日志记录错误状态码 // _logger.LogError("获取单车辆失败,状态码:{StatusCode}", result.StatusCode); return null; } } catch (Exception ex) { // 可选:添加日志记录异常信息 // _logger.LogError(ex, "获取单车辆时发生异常"); return null; } }
3. 添加控制器接口(如果未实现)
在控制器中新增通过ID获取车辆的接口:
[HttpGet("samsara/{id}")] public async Task<IActionResult> GetVehicleById( [FromServices] SamsaraGpsService samsaraGps, string id) { var vehicle = await samsaraGps.GetVehicleById(id); if (vehicle == null) { return NotFound(); } return Ok(vehicle); }
额外建议
- 避免直接返回
null,可以考虑抛出自定义异常或者返回更明确的错误信息,便于调试和前端处理。 - 复用现有模型:
SamsaraGpsVehicleInfo和SamsaraVehicle结构高度相似,可以考虑合并为一个模型,减少代码冗余。
内容的提问来源于stack exchange,提问作者Johnny Squardo
相关产品推荐
相关产品推荐

