调用gitlab api问题

调用gitlab api上传文件至仓库中,下面的代码不知道哪里有问题,不能实现需求。有没有朋友帮忙看看是哪里的问题,或者重新写一下


QString Url = "http://************/";
    QString privateToken = "*************************";
    int projectId = 15011;
    QString filePath = "1.xlsx";
    QString branch = "main";
    QString commitMessage = "Update file";
    QString content = "New content of the file";


    QString apiUrl = Url + "api/v4/projects/" + QString::number(projectId) +
        "/repository/files/" + filePath;

    QJsonObject params;
    params["branch"] = branch;
    params["id"] = 150;
    params["file_path"] = "1.xlsx";
    params["commit_message"] = commitMessage;
    params["content"] = content;

    QByteArray jsonData = QJsonDocument(params).toJson();

    CURL* curl = curl_easy_init();
    if (curl) {
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, ("PRIVATE-TOKEN: " + privateToken).toUtf8().constData());

        curl_easy_setopt(curl, CURLOPT_URL, apiUrl.toUtf8().constData());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.constData());

        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            qDebug() << "Error: " + QString(curl_easy_strerror(res));
        }
        qDebug() << "File updated successfully.";
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
        
    }
    qDebug() << "Failed to initialize libcurl.";

请求接口还有其他信息可以获取的吧,只能拿到code吗,看看能不能拿到msg等提示信息。

需要发下你运行后的报错信息的

确保你的gitlab地址设置时正确的,可以通过api接口访问。
保证你的代码里面参数配置都是正确的
如果需要大家帮助你回答问题,建议先把错误截图放出来

参考gpt:
结合自己分析给你如下建议:
您的代码中可能有以下几个问题:
您没有指定HTTP请求的方法,应该使用PUT方法来更新文件,或者使用POST方法来创建文件。
您没有对文件内容进行Base64编码,GitLab API要求文件内容必须是Base64编码的字符串。
您没有正确地设置CURL的选项,比如CURLOPT_CUSTOMREQUEST, CURLOPT_POSTFIELDSIZE, CURLOPT_WRITEFUNCTION等。
为了帮助您解决问题,我为您生成了一个可能的修改后的代码,您可以参考一下:

QString Url = "http://************/";
QString privateToken = "*************************";
int projectId = 15011;
QString filePath = "1.xlsx";
QString branch = "main";
QString commitMessage = "Update file";
QString content = "New content of the file";

// 对文件内容进行Base64编码
QByteArray contentData = content.toUtf8().toBase64();

QString apiUrl = Url + "api/v4/projects/" + QString::number(projectId) +
    "/repository/files/" + filePath;

QJsonObject params;
params["branch"] = branch;
params["id"] = 150;
params["file_path"] = "1.xlsx";
params["commit_message"] = commitMessage;
params["content"] = contentData; // 使用编码后的内容

QByteArray jsonData = QJsonDocument(params).toJson();

CURL* curl = curl_easy_init();
if (curl) {
    struct curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, ("PRIVATE-TOKEN: " + privateToken).toUtf8().constData());

    curl_easy_setopt(curl, CURLOPT_URL, apiUrl.toUtf8().constData());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    // 使用PUT方法来更新文件
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
    // 设置请求数据的大小
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonData.size());
    // 设置请求数据的内容
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.constData());
    // 设置响应数据的回调函数
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);

    CURLcode res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
        qDebug() << "Error: " + QString(curl_easy_strerror(res));
    }
    qDebug() << "File updated successfully.";
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
    
}
qDebug() << "Failed to initialize libcurl.";

其中,write_callback是一个自定义的函数,用于处理服务器返回的响应数据,您可以根据自己的需求来实现它。一个简单的例子如下:

size_t write_callback(char *ptr, size_t size, size_t nmemb, void *userdata)
{
  // ptr是响应数据的指针,size是每个数据块的大小,nmemb是数据块的数量,userdata是用户自定义的数据
  // 这里只是简单地打印出响应数据,您可以根据需要进行其他操作
  qDebug() << QString::fromUtf8(ptr, size * nmemb);
  return size * nmemb; // 返回处理的数据大小
}

你要把你的测试样例发出来

【以下回答由 GPT 生成】

问题所在: 1. 在params参数对象中,id的值设置为了150,而不是正确的projectId。 2. 错误处理不完善,没有检查curl_easy_perform返回的错误代码,只是简单地输出了错误信息。 3. 缺少对curl_easy_perform的返回值CURLE_OK的判断,没有处理上传文件失败的情况。

优化后的代码:

#include <curl/curl.h>
#include <iostream>
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>

size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main() {
    QString Url = "http://************/";
    QString privateToken = "*************************";
    int projectId = 15011;
    QString filePath = "1.xlsx";
    QString branch = "main";
    QString commitMessage = "Update file";
    QString content = "New content of the file";

    QString apiUrl = Url + "api/v4/projects/" + QString::number(projectId) + "/repository/files/" + filePath;

    QJsonObject params;
    params["branch"] = branch;
    params["commit_message"] = commitMessage;
    params["content"] = content;

    QJsonDocument payload(params);
    QByteArray jsonData = payload.toJson();

    CURL* curl = curl_easy_init();
    if (curl) {
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, ("PRIVATE-TOKEN: " + privateToken).toUtf8().constData());

        curl_easy_setopt(curl, CURLOPT_URL, apiUrl.toUtf8().constData());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.constData());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonData.size());

        std::string response_string;
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);

        CURLcode res = curl_easy_perform(curl);

        if (res != CURLE_OK) {
            qDebug() << "Error: " << QString(curl_easy_strerror(res));
        } else {
            long response_code;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);

            if (response_code == 200 || response_code == 201) {
                qDebug() << "File updated successfully.";
            } else {
                qDebug() << "File update failed. Response code: " << QString::number(response_code);
            }
        }

        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }

    return 0;
}

优化后的代码解决了以下问题: 1. 正确设置了params中的projectId。 2. 添加了对curl_easy_perform返回错误代码的处理,输出相关错误信息。 3. 更新了对于上传文件是否成功的处理逻辑,通过检查返回的response code判断上传结果。如果返回 200 或 201,则表示上传成功,否则表示上传失败。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

#include <curl/curl.h>
#include <iostream>
#include <QString>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>
size_t WriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
    ((std::string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}
int main() {
    QString Url = "http://************/";
    QString privateToken = "*************************";
    int projectId = 15011;
    QString filePath = "1.xlsx";
    QString branch = "main";
    QString commitMessage = "Update file";
    QString content = "New content of the file";
    QString apiUrl = Url + "api/v4/projects/" + QString::number(projectId) + "/repository/files/" + filePath;
    QJsonObject params;
    params["branch"] = branch;
    params["commit_message"] = commitMessage;
    params["content"] = content;
    QJsonDocument payload(params);
    QByteArray jsonData = payload.toJson();
    CURL* curl = curl_easy_init();
    if (curl) {
        struct curl_slist* headers = nullptr;
        headers = curl_slist_append(headers, ("PRIVATE-TOKEN: " + privateToken).toUtf8().constData());
        curl_easy_setopt(curl, CURLOPT_URL, apiUrl.toUtf8().constData());
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
        curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.constData());
        curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, jsonData.size());
        std::string response_string;
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            qDebug() << "Error: " << QString(curl_easy_strerror(res));
        } else {
            long response_code;
            curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &response_code);
            if (response_code == 200 || response_code == 201) {
                qDebug() << "File updated successfully.";
            } else {
                qDebug() << "File update failed. Response code: " << QString::number(response_code);
            }
        }
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
    return 0;
}

试试

QString Url = "http://****************/";

QString privateToken = "*******************************";

int projectId = 15011;

QString filePath = "1.xlsx";

QString branch = "main";

QString commitMessage = "Update file";


QFile file(filePath);

if (!file.open(QIODevice::ReadOnly)) {
  qDebug() << "Cannot open file: " << file.errorString();
  return;
}

QByteArray content = file.readAll();

file.close();

QString encodedContent = content.toBase64();


QString encodedFilePath = QUrl::toPercentEncoding(filePath);


QString apiUrl = Url + "api/v4/projects/" + QString::number(projectId) +
                 "/repository/files/" + encodedFilePath;

QJsonObject params;
params["branch"] = branch;
params["commit_message"] = commitMessage;
params["content"] = encodedContent;
params["encoding"] = "base64";

QByteArray jsonData = QJsonDocument(params).toJson();


CURL* curl = curl_easy_init();

if (curl) {

  struct curl_slist* headers = nullptr;
  headers = curl_slist_append(headers, ("PRIVATE-TOKEN: " + privateToken).toUtf8().constData());
  
  curl_easy_setopt(curl, CURLOPT_URL, apiUrl.toUtf8().constData());
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonData.constData());

  CURLcode res = curl_easy_perform(curl);

  if (res != CURLE_OK) {
    qDebug() << "Error: " + QString(curl_easy_strerror(res));
  } else {
    qDebug() << "File uploaded successfully.";
  }

  curl_slist_free_all(headers);
  curl_easy_cleanup(curl);

} else {
  qDebug() << "Failed to initialize libcurl."; 
}

GitLab API 的使用教程
可以参考下


https://codeleading.com/article/66764945604/