我在节点应用程序中使用express with request。这是我的请求函数
var request = function (options, callback, args) {
options.headers = {'User-Agent': 'RETRACTED'};
options.url = config.api.git.base + '/orgs/RETRACTED/repos?access_token=' + config.tokens.git;
remoteRequest(options, function (error, response, body) {
if (!error) {
callback(response, args);
} else {
throw error;
}
});
};
我遇到的问题是GitHub API本身每页只提供30个结果。标题中的内容是:
Link:
<https://api.github.com/organizations/RETRACTED/repos?access_token=RETRACTED&page=2>;rel="next",
<https://api.github.com/organizations/RETRACTED/repos?access_token=RETRACTED&page=3>;rel="last"
现在,我可以通过在网址per_page=100
中添加参数来解决这个问题,以确保获得我的组织拥有的60个回购。现在你可能已经注意到,这不是最好的解决方案,因为如果我们超过100,有人将不得不更新它。除了一切之外,我们还有几百个问题,我正在为它们使用相同的功能。
但这最多只能达到100.从github documentation我可以看到您可以使用?page
参数指定更多页面
我会感谢任何提示,只要它们存在,如何请求下一页,将结果连接到我在那里的response
变量,然后执行回调。
我记得在看到一个例子之前有人在做什么,但我似乎无法找到它,所以要么在google搜索时我的术语是关闭的,要么是我绊倒并且请求本身不能这样做?
编辑:我找到的一种解决方法(暂时没有网址验证)
var request = function (options, callback, args) {
options.headers = {'User-Agent': 'RETRACTED'};
remoteRequest(options, function (error, response, body) {
var links;
if (!error) {
if (response.headers.link) {
links = response.headers.link.split(',');
links.forEach(function (link) {
if (link.indexOf('next') !== -1) {
options.url = link.split(';')[0].replace(/[<>]/g,'');
request(options, callback, args);
}
});
}
callback(response, args);
} else {
throw error;
}
});
};
我不确定这是多少可行的解决方案,因为回调正在每个页面之后执行,在这种情况下我不介意那么多,因为只有简单的逻辑将其保存在数据库中。