我正在使用 Youtube Data API 通过搜索查询来搜索即将举行的活动。
具体查询是
https://www.googleapis.com/youtube/v3/search?part=id%2Csnippet&eventType=upcoming&q=vs&type=video&key={api_key}
返回的pageInfo.totalResults约为150272
虽然当我尝试对它们进行分页时,我只获得了 147 个项目,直到响应中的项目数组为空,并且每个响应中的 nextPageToken 都是相同的,这样我就继续循环尝试获得更多结果(耗尽了我的API 配额)并且不返回任何内容。这是一个错误吗?
您可以参考此文档 - Paging through results,API 响应使用 link 标签来识别 Feed 中上一页和/或下一页条目的
pagination
链接。为了避免分页问题,官方文档建议您看到这些链接,以便用户能够链接到 API 结果的不同页面。
API 使用 start-index 和 max-results 请求参数来确定 API 响应中包含哪些结果。此外,API 响应使用 标签来估算 Feed 中的条目总数。
<openSearch:startIndex>26</openSearch:startIndex>
<openSearch:itemsPerPage>25</openSearch:itemsPerPage>
<openSearch:totalResults>107</openSearch:totalResults>
也许尝试一下这个函数来为你解决分页问题:
public static async Task<List<T>> ExecuteRequest<T>(dynamic request, CancellationToken cancelToken)
{
string nextPageToken = "";
var result = new List<T>();
do
{
request.MaxResults = 100;
if (!String.IsNullOrEmpty(nextPageToken))
request.PageToken = nextPageToken;
var response = await request.ExecuteAsync(cancelToken);
nextPageToken = response.NextPageToken;
result.AddRange(response.Items);
} while (!String.IsNullOrEmpty(nextPageToken));
return result;
}
并使用这样的东西:
private async Task GetPlaylistAsync(string playlistId)
{
var request = Client.PlaylistItems.List("snippet");
request.PlaylistId = playlistId;
var videos = await Functions.ExecuteRequest<Google.Apis.YouTube.v3.Data.PlaylistItem>(request, CancellationToken);
}
您可以轻松地将其修改为您的 YouTubeApi 版本与分页的配合方式。