【问题标题】:Adding attachment to JIRA issue using the REST API and Qt with QNetworkRequest使用 REST API 和带有 QNetworkRequest 的 Qt 将附件添加到 JIRA 问题
【发布时间】:2015-07-07 18:27:35
【问题描述】:

我正在尝试使用 REST API 和 Qt 为现有的 JIRA 问题添加附件。

当我运行下面的代码时,回复是一个空数组(“[]”)。

编辑:更新代码

QString APIhandler::attachFile(QString fileloc, QString issueKey, QString cookie)
{

//create multiPart
QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

QFile *file = new QFile(fileloc);
//create httpPart for file
QHttpPart filePart;

filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\""+ file->fileName()+ "\""));



file->open(QIODevice::ReadOnly); 
filePart.setBodyDevice(file);

file->setParent(multiPart);

multiPart->append(filePart);

QNetworkAccessManager *mngr = new QNetworkAccessManager();

QUrl issurl(baseURL + "/api/2/issue/"+ issueKey + "/attachments");

QNetworkRequest req(issurl);
QNetworkReply *reply ;

QEventLoop loop;

//add headers
req.setRawHeader("cookie", "JSESSIONID = " + cookie.toUtf8()); // the session cookie
req.setRawHeader("X-Atlassian-Token", "nocheck");
req.setRawHeader("Content-Type", "multipart/form-data; boundary=------------------------53a5a2cd1d9c8b7f");
//req.setRawHeader("Content-Length", postDataSize);

reply = mngr->post(req, multiPart);
multiPart->setParent(reply);
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

loop.exec();


return reply->readAll();

}

I am using the JIRA REST API documentationqt documentation 供参考,并查看 this java 实现(我已尝试复制)。

看来我要么缺少标题,要么错误地添加了文件。

非常感谢任何帮助!

编辑 - 这是一个使用 curl (LEFT) 和我的代码 (RIGHT) 比较来自 api 的示例的 wireshark 的一部分。左边那个有效,显然有不同的 MIME 数据,但我不确定如何在 Qt 中实现它

【问题讨论】:

  • 您是否有权访问使用 REST API 的工作系统?如果是这样,您可以获取添加附件的工作系统的 Wireshark 跟踪,并与 API 调用的 Wireshark 跟踪进行比较。
  • @DavidLaPorte - 不幸的是我没有。
  • 如果没有,如何测试这段代码?
  • 您是否尝试过使用 API 文档中所述的curlcurl -D- -u admin:admin -X POST -H "X-Atlassian-Token: nocheck" -F "file=@myfile.txt" http://myhost/rest/api/2/issue/TEST-123/attachments 并从您的代码中获取 Wireshark 跟踪信息?
  • @Koshinae 我可以访问工作服务器以提交文件和 JIRA 问题,但使用普通网页添加附件似乎不使用 api。

标签: c++ qt rest jira jira-rest-api


【解决方案1】:

好的,所以我想通了。我可能是地球上唯一一个正在使用(或将使用)Qt 与 JIRA API 交互的人,但为了后代,这就是我想出的:

QString APIhandler::attachFile(QString fileloc, QString issueKey, QString cookie)
{

    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
    QHttpPart filePart;
    QFileInfo fileInfo(fileloc);

    //what I wasn't doing before!
    multiPart->setBoundary("------------------------53a5a2cf4d9c8b7f");

    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"file\"; filename=\""+fileInfo.fileName() +"\""));
    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));

    QFile *file = new QFile(fileloc);
    file->open(QIODevice::ReadOnly); 
    filePart.setBodyDevice(file);

    file->setParent(multiPart);
    multiPart->append(filePart);

    QNetworkAccessManager *mngr = new QNetworkAccessManager();

    QUrl issurl(baseURL + "/api/2/issue/"+ issueKey + "/attachments");

    QNetworkRequest req(issurl);
    QNetworkReply *reply ;

    QEventLoop loop;

    //add headers
    req.setRawHeader("X-Atlassian-Token", "nocheck");
    req.setRawHeader("cookie", "JSESSIONID = " + cookie.toUtf8()); // the session cookie
    req.setRawHeader("Content-Type", "multipart/form-data;boundary=------------------------53a5a2cf4d9c8b7f");

    reply = mngr->post(req, multiPart);
    multiPart->setParent(reply);
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));

    loop.exec();

    //read the reply
    QByteArray bytes=reply->readAll();

    //return the reply JSON 
    return QString::fromUtf8(bytes.data(), bytes.size());

    delete file;
    delete multiPart;
    delete reply;
    delete mngr;

}

这里的关键部分,以及我做错了什么,是我为多部分设置边界的方式。而不是在标题中设置它,我应该使用:

multipart->setBoundary()

你可以在上面看到。

如果您遇到此问题并打算使用它,我建议您先清理一下。但它有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2013-07-09
    • 2012-08-06
    相关资源
    最近更新 更多