首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >QtCUrl post不再工作(Linux nok...windows ok)

QtCUrl post不再工作(Linux nok...windows ok)
EN

Stack Overflow用户
提问于 2019-07-30 05:22:45
回答 1查看 82关注 0票数 0

自去年以来,我一直在我的程序中运行这个函数(Linux和Windows)。

现在我需要实现一个新函数,而我的新构建不再运行。

我还有其他使用POST的CUrl函数,结果都是一样的: nok,但我的GET函数是ok的。

我有另一台计算机(安装了Mint19),该程序运行得很流畅,但在我的计算机(也使用Mint19)上,编译是正常的,但它启动了curl.exec (我使用的是Qtcurl库,inside调用了curl_easy_perform),并且不再返回。

我安装了这个包: libcurl4-openssl-dev

可以编译我的程序(Linux和Windows)。此程序在Windows上运行。

我的问题是Mint19中的新版本。

安装时缺少什么?

代码语言:javascript
代码运行次数:0
运行
复制
QUrl url("https://pos-api.ifood.com.br/oauth/token");
QUrlQuery q;
q.addQueryItem("client_id", id); 
q.addQueryItem("client_secret", secret); 
q.addQueryItem("grant_type","password"); 
q.addQueryItem("username",user); 
q.addQueryItem("password",password); 

url.setQuery(q);

QtCUrl::Options opt;
opt[CURLOPT_URL] = url;
opt[CURLOPT_POST] = true;
opt[CURLOPT_FOLLOWLOCATION] = true;
opt[CURLOPT_FAILONERROR] = true;


opt[CURLOPT_SSL_VERIFYPEER]= false;  // windows

QStringList headers;
headers
    << "cache-control: no-cache"
    << "content-type: application/x-www-form-urlencoded";
opt[CURLOPT_HTTPHEADER] = headers;
val = cUrl.exec(opt);  // PROBLEM HERE!!!!

if (cUrl.lastError().isOk()) {

    bool ok;
    // json is a QString containing the JSON data
    QtJson::JsonObject result = QtJson::parse(val, ok).toMap();
    token=result["access_token"].toString();


    return token;
}
else {
    return "";
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-01 22:21:25

我改变了我所有的方法。

第一个函数是带有查询的POST。

代码语言:javascript
代码运行次数:0
运行
复制
    QString iFood_getToken2(QString token, int *expira, QString id, QString secret, QString user, QString password, QString host){
    if(host!=hostname || !ifood_ativo){
        qDebug() << "iFood_getToken2 saindo...";
        return "";
    }

    if(*expira>IFOOD_TASK){
        *expira-=IFOOD_TASK;
       // qDebug() << "expira " << *expira;
        return token;   // token válido
    }

    QUrl url("https://pos-api.ifood.com.br/oauth/token");

    QUrlQuery q;
    q.addQueryItem("client_id", id); 
    q.addQueryItem("client_secret", secret); 
    q.addQueryItem("grant_type","password"); 
    q.addQueryItem("username",user); 
    q.addQueryItem("password",password); 
    url.setQuery(q);

    QNetworkRequest request(url);
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
    request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QVariant(int(QNetworkRequest::AlwaysNetwork)));

    QJsonObject json;

    QNetworkAccessManager nam;

    QNetworkReply *reply = nam.post(request, QJsonDocument(json).toJson());

    while (!reply->isFinished())
    {
        qApp->processEvents();
    }

    QByteArray response_data = reply->readAll();
    QJsonDocument jsonr = QJsonDocument::fromJson(response_data);
    reply->deleteLater();

    //qDebug() << "ifoodtoken2 " << jsonr["access_token"].toString();

    return jsonr["access_token"].toString();
}

我实现了这些新函数:

GET和补丁有一个新的实现

所以,从现在开始,我不再需要使用CUrl库了

代码语言:javascript
代码运行次数:0
运行
复制
QJsonDocument networkGet(QString strUrl, QString token){
    QUrl url(strUrl);

    QNetworkRequest request(url);
    request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QVariant(int(QNetworkRequest::AlwaysNetwork)));

    QString headerData = "bearer " + token;
    request.setRawHeader("Authorization", headerData.toLocal8Bit());

    QJsonObject json;

    QNetworkAccessManager nam;

    QNetworkReply *reply = nam.get(request);

    while (!reply->isFinished())
    {
        qApp->processEvents();
    }

    QByteArray response_data = reply->readAll();
    QJsonDocument json_response = QJsonDocument::fromJson(response_data);
    reply->deleteLater();

    //qDebug() << "networkGet " << json_response << reply->errorString() << headerData ;

    return json_response;

}

int networkPatch(QString strUrl, QString token, QJsonDocument json){
    QUrl url(strUrl);

    QNetworkRequest request(url);
    request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QVariant(int(QNetworkRequest::AlwaysNetwork)));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    QString headerData = "bearer " + token;
    request.setRawHeader("Authorization", headerData.toLocal8Bit());

    QNetworkAccessManager nam;

    QByteArray * _b_arr = new QByteArray (QString(json.toJson()).toLatin1());
    QBuffer *_qbf_upload =new QBuffer (_b_arr);
    QNetworkReply *reply = nam.sendCustomRequest(request,"PATCH",_qbf_upload);

    while (!reply->isFinished())
    {
        qApp->processEvents();
    }

    QByteArray response_data = reply->readAll();
    QJsonDocument json_response = QJsonDocument::fromJson(response_data);
    reply->deleteLater();

    qDebug() << "networkPatch " << reply->error() << json_response << reply->errorString() << headerData ;

    return reply->error();

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57261587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档