我改变了我所有的方法。
第一个函数是一个带有查询的 POST。
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 和 PATCH 有一个新的实现
所以,从现在开始我不再需要使用 CUrl 库了
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();
}