.net core 2.2 httpclient Factory 没有给出完整数据作为响应

.net core 2.2 httpclient Factory not giving Full data as response

我正在为我的航班列表应用程序使用 .net core 2.2,为此我正在使用 wego api。但是当我使用下面的代码从 wego api 获取航班时,我没有得到完整的响应,但是在邮递员中我得到了一个请求的完整结果集。

public async Task<SearchResultMv> GetFlights(FlightParam flightParam, AuthResult auth)
{
    var request = new HttpRequestMessage(HttpMethod.Get, "https://srv.wego.com/metasearch/flights/searches/" + flightParam.SearchId + "/results?offset=0&locale=" + flightParam.locale + "&currencyCode=" + flightParam.currencyCode);
    request.Headers.Add("Bearer", auth.access_token);
    request.Headers.Add("Accept", "application/json");

    var client = _httpClient.CreateClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", auth.access_token);

    var response = await client.SendAsync(request).ConfigureAwait(false);

    SearchResultMv json = new SearchResultMv();

    response.EnsureSuccessStatusCode();

    if (response.IsSuccessStatusCode)
    {
        json = await response.Content.ReadAsAsync<SearchResultMv>().ConfigureAwait(false);
        return json;
    }
}

有时我没有得到上面代码设置的任何结果。 Wego api 未对此 api 提供任何分页或过滤。所以请帮助我实现这一目标。感谢您的提前。

根据他们的文档,您需要轮询他们的 API 才能逐渐获得结果。您还需要在返回结果时增加偏移量。

例如,如果第一组结果给您 100 个结果,则以下请求应将偏移值设置为 100。offset=100.

文档: https://developers.wego.com/affiliates/guides/flights

编辑 - 添加示例解决方案

每秒轮询 API 直到达到所需结果数的示例代码。此代码尚未经过测试,因此您需要根据需要对其进行调整。

const int numberOfResultsToGet = 100;
var results = new List<SearchResultMv>();

while (results.Count < numberOfResultsToGet)
{
    var response = await GetFlights(flightParam, auth);
    results.AddRange(response.Results);

    // update offset
    flightParam.Offset += response.Results.Count;

    // sleep for 1 second before sending another request
    Thread.Sleep(TimeSpan.FromSeconds(1));
}

更改您的请求以使用动态 Offset 值。您可以将 Offset 属性 添加到 FlightParam class。

var request = new HttpRequestMessage(
    HttpMethod.Get, 
    $"https://srv.wego.com/metasearch/flights/searches/{flightParam.SearchId}/results?" +
    $"offset={flightParam.Offset}" +
    $"&locale={flightParam.locale}" +
    $"&currencyCode={flightParam.currencyCode}");