Github API获取对给定存储库分支的所有提交

时间:2020-10-27 15:22:10

标签: git github github-api github-api-v3

我正在尝试使用github api获取对存储库 class Worker : public QObject { Q_OBJECT public slots: void doWork(const QString &parameter) { QString result; forever{ if(QThread::currentThread()->isInterruptionRequested()){ printf("true"); return; }else{ if(!QThread::currentThread()->isInterruptionRequested()){ cout<<parameter.toStdString(); } } } emit resultReady(result); } signals: void resultReady(const QString &result); }; 的{​​{1}}分支的所有提交,但是无论我如何传递查询参数,我始终会获得首页。不确定我发送的请求中有什么问题。

    class Controller : public QObject
    {
        Q_OBJECT
        QThread workerThread;
    public:
        Controller(QObject *parent = nullptr):QObject(parent) {
            Worker *worker = new Worker;
            worker->moveToThread(&workerThread);
            connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
            connect(this, &Controller::operate, worker, &Worker::doWork);
            workerThread.start();
        }
        ~Controller() {
            workerThread.quit();
            workerThread.wait();
        }
    public slots:
        void stop(){
            workerThread.requestInterruption();
        }
    signals:
        void operate(const QString &);
    };

我总是得到第一页。我尝试使用给定here

的查询参数

1 个答案:

答案 0 :(得分:1)

您似乎访问了错误的端点。发送给您的是this one,在这里您仅收到一次提交(对于您而言,是最新的develop提交)。

您需要为您的应用实现一些分页逻辑并访问以下端点:/repos/{owner}/{repo}/commits

例如,要获取开发分支的提交,您可以发送这样的请求:

curl -H "Authorization: XYZ" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/ACCNAME/REPO/commits\?sha\=develop

(如果您使用的是octokit,那会更漂亮,但这只是一个示例:))

现在,为了让您分页,您还需要查询per_pagepage参数,并检查是否已达到限制。

基本上,使用以下查询:

curl -H "Authorization: XYZ" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/ACCNAME/REPO/commits\?sha\=develop\&per_page\=X\&page\=Y

其中XY是传递给curl请求的参数。收到响应后,您将检查数组的长度(因为您将获得提交的数组)是否等于X。如果是这样,请再次提出请求,但是这次增加Y+1,这样您将获得下一页。循环执行此过程,直到得到的响应比所需的X ,因为这样您将知道您将从回购中获得最后的提交。


节点中的示例(免责声明,未正确编写代码)

let allCommits = [];

let call = function(n, y) {
    return new Promise((resolve, reject) => {
        getCommits(function(statusCode, result) {
            allCommits.push(result);
            if (result.length === y) {
               call(n + 1, y);
            }
        }, n, y);
    });
};

如果getCommits是从分支获取一系列提交的函数,并且将path定义为path: '/repos/ACC_NAME/REPO/commits?sha=develop&page=' + n + '&per_page=' + y,那么最后您将拥有所有提交页面allCommits数组。最后,您只需要把它弄平,但是精通js技能的人可以提供一种更优雅的方法来实现此目的。

相关问题