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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:20:15