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

.NET Core 2.2 HttpClient Factory调用Wego API响应不完整问题求助

排查Wego API调用不完整响应的问题

我来帮你梳理下可能导致这个问题的几个关键点,咱们一步步解决:

1. 错误的Authorization头设置

你代码里同时做了两个Authorization相关的操作:

  • request.Headers.Add("Bearer", auth.access_token); —— 这是错误的!HTTP标准里的Bearer认证头应该是Authorization: Bearer <token>,你这里把"Bearer"当成了头名称,而不是值的前缀,这会导致请求头里多了一个无效的Bearer头,和后面正确设置的Authorization头冲突,Wego API可能因此无法正确处理你的请求,返回不完整或空结果。
  • client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth.access_token); —— 这个是正确的,保留这一行,删掉前面错误的request.Headers.Add("Bearer", ...)即可。

2. URL中的转义字符错误

你构造URL时用了&amp;来拼接参数,这是HTML的转义字符,但在.NET的HttpRequestMessage中,直接用&拼接参数就可以了。手动写&amp;会导致最终发送的URL被双重转义,变成&amp;amp;,API无法正确解析offset、locale等参数,自然返回的结果不对。

3. HttpClient超时与实例管理

航班查询API通常响应较慢,如果你的HttpClient超时设置过短(默认是100秒,但网络波动时可能不够),会导致请求被提前终止,拿不到完整响应。建议显式设置一个更长的超时时间,比如3分钟。另外,确保你用的IHttpClientFactory是正确配置的,没有其他全局配置干扰请求。

4. 反序列化排查

有时候API返回的JSON结构和你的SearchResultMv类不匹配,会导致反序列化时丢失数据,甚至返回默认实例。建议先把响应内容读取成字符串,对比Postman的返回结果,确认结构一致;同时可以用Newtonsoft.Json(.NET Core 2.2中默认的System.Text.Json功能有限)来做反序列化,更灵活地处理字段大小写、缺失字段等问题。

修改后的代码示例

using Newtonsoft.Json; // 需要安装Newtonsoft.Json NuGet包

public async Task<SearchResultMv> GetFlights(FlightParam flightParam, AuthResult auth) 
{ 
    // 用正确的&拼接参数,避免转义问题
    var requestUrl = $"https://srv.wego.com/metasearch/flights/searches/{flightParam.SearchId}/results?offset=0&locale={flightParam.locale}&currencyCode={flightParam.currencyCode}";
    
    var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
    request.Headers.Add("Accept", "application/json"); 

    var client = _httpClient.CreateClient(); 
    // 保留正确的Authorization头设置
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth.access_token);
    // 设置更长的超时时间,适配API响应速度
    client.Timeout = TimeSpan.FromMinutes(3);

    var response = await client.SendAsync(request).ConfigureAwait(false); 
    // 确保请求成功,否则抛出异常
    response.EnsureSuccessStatusCode(); 

    // 先读取响应字符串,方便调试对比
    var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
    // 调试阶段可以把responseContent输出到日志,和Postman的返回结果对比
    var searchResult = JsonConvert.DeserializeObject<SearchResultMv>(responseContent); 

    return searchResult; 
}

额外建议

  • 添加日志:记录请求的URL、头信息、响应状态码和响应内容(脱敏后),方便排查请求是否和Postman一致。
  • 检查Rate Limit:有些API会限制请求频率,如果你代码中频繁调用,可能触发限制导致返回部分数据,Postman单次请求没问题但代码中不行。
  • 验证类结构:确保SearchResultMv的属性和API返回的JSON字段完全匹配,比如用[JsonProperty("field_name")]指定字段名,或者配置反序列化器忽略大小写。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:32:44