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

跨Web API数据调用问题:如何在目标API中正确获取abc-api返回的合规文档通知数据

解决API调用数据获取问题的分步方案

咱们先捋清楚问题根源,再一步步解决:

1. 先修复源API(abc-api)的类型不匹配问题

你当前的RefreshComplianceDocumentNotification方法里,carrierAdminUserEmails是匿名类型的IQueryable,但你直接强转成ICollection<CarrierCompilanceDocumentViewModel>,这会导致运行时类型转换失败,而且序列化时也会出现结构不匹配的问题。

修改源API代码,直接在Select里映射到你的ViewModel类型,而非匿名对象:

public async Task<ICollection<CarrierCompilanceDocumentViewModel>> RefreshComplianceDocumentNotification(Guid tenantId, Guid countryId) 
{ 
    DateTime now = DateTime.UtcNow; 
    var expiriesDays = new List<int> { 1, 7, 14 }; 
    var expiriesDates = expiriesDays.Select(x => now.AddDays(x).Date).ToList(); 
    
    var carrierAdminUserEmails = await _dbContext.CarrierUsers.IgnoreQueryFilters() 
        .Where(x => x.IsAdmin) 
        .Where(x => !x.IsDeleted && x.TenantId == tenantId && x.TenantCountryId == countryId) 
        .Where(x => x.Carrier.ComplianceExpiryDate != null) 
        // 直接映射到ViewModel,确保属性对应
        .Select(x => new CarrierCompilanceDocumentViewModel
        {
            Email = x.Email,
            ComplianceExpiryDate = x.Carrier.ComplianceExpiryDate.Value
        }) 
        .Distinct()
        .ToListAsync(); // 异步执行查询,转为ViewModel集合
    
    return carrierAdminUserEmails;
}

注意:要确认CarrierCompilanceDocumentViewModel类中确实存在Email和ComplianceExpiryDate这两个公开属性,否则映射会失败。

2. 修复目标API的调用代码

你的调用代码存在两个核心问题:

  • 使用.Result会引发异步死锁(尤其在ASP.NET环境中),必须改用await
  • 读取字符串后未反序列化为对应的ViewModel集合

修改后的调用代码如下:

var client = _clientFactory.CreateClient("carrier"); 
var request = HttpHelper.GetRequestMessageApiKey(_config, HttpMethod.Post, $"{_carrierHost}/api/cms/carrier-company/RefreshComplianceDocumentNotification?tenantId={tenantId}&countryId={countryId}"); 

// 用await替代.Result,避免死锁
var response = await HttpHelper.GetResponseMessage(client, request); 

// 确保请求成功再处理后续逻辑
response.EnsureSuccessStatusCode();

// 反序列化为ViewModel集合
var result = await response.Content.ReadFromJsonAsync<ICollection<CarrierCompilanceDocumentViewModel>>();

// 现在可以正常使用result中的3条数据了
foreach(var item in result)
{
    // 示例:打印或处理每条数据
    Console.WriteLine($"管理员邮箱:{item.Email},合规到期日:{item.ComplianceExpiryDate}");
}

额外检查项

  • 确认HttpHelper.GetRequestMessageApiKey是否正确设置了请求头(比如Content-Type: application/json、有效API密钥)
  • 若该接口仅用于获取数据,建议将请求方法改为HttpMethod.Get,同步修改源API的Http特性注解,更符合REST规范
  • 检查源API是否启用CORS(若目标API与源API跨域)

内容的提问来源于stack exchange,提问作者Nic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 21:37:42