如何在Rawg.io API中实现多标签交集的游戏搜索?
解决Rawg.io标签交集查询的问题
临时解决方案:客户端侧做交集处理
Rawg.io的tags参数默认是OR逻辑(返回包含任意指定标签的游戏),官方API目前没有提供强制交集的参数。你可以通过以下步骤在客户端实现需求:
- 分别请求每个标签下的所有游戏列表(注意处理分页,避免漏掉数据)
- 提取每个列表的游戏ID,找出三个列表的共同ID(交集)
- 用这些共同ID批量查询游戏详情
代码示例
const API_KEY = 'XXXXX'; const API_URL = `https://api.rawg.io/api/games?key=${API_KEY}`; // 获取单个标签下的所有游戏(自动处理分页) async function fetchAllGamesForTag(tag) { let allGames = []; let currentPage = 1; while (true) { const res = await fetch(`${API_URL}&tags=${tag}&page_size=40&page=${currentPage}`); const data = await res.json(); allGames = [...allGames, ...data.results]; if (!data.next) break; // 没有下一页时停止请求 currentPage++; } return allGames; } // 获取同时包含所有指定标签的游戏 async function getGamesWithAllTags(targetTags) { // 并行获取每个标签的游戏列表 const tagGameLists = await Promise.all(targetTags.map(fetchAllGamesForTag)); // 将每个列表转为ID集合,方便求交集 const idSets = tagGameLists.map(list => new Set(list.map(game => game.id))); // 找出所有集合的共同ID const commonGameIds = [...idSets[0]].filter(id => { return idSets.every(set => set.has(id)); }); // 批量查询这些ID对应的游戏详情 if (commonGameIds.length === 0) return []; const detailRes = await fetch(`${API_URL}&ids=${commonGameIds.join(',')}`); const detailData = await detailRes.json(); return detailData.results; } // 使用示例 getGamesWithAllTags(['action', 'cooperative', 'farm']) .then(matchingGames => console.log('匹配的游戏:', matchingGames)) .catch(error => console.error('请求出错:', error));
注意事项
- 该方法需要多次请求API,要注意Rawg.io的请求频率限制,避免被限流
- 如果标签下的游戏数量极多,分页请求会增加耗时,可以根据需求调整
page_size(最大支持40)
支持标签交集的替代游戏数据库
如果客户端处理的方式不够高效,可以考虑切换到支持原生标签交集查询的平台:
- IGDB:基于GraphQL的API,支持灵活的过滤逻辑,可直接指定多个标签必须同时存在
- Giant Bomb API:提供高级搜索功能,能通过参数组合实现多标签交集筛选
- Steam Web API:针对Steam平台游戏,支持通过筛选器指定多个标签的交集查询
内容的提问来源于stack exchange,提问作者Nellie
相关产品推荐
相关产品推荐

