Tôi đã chạy chức năng này trong chương trình của mình từ năm ngoái (Linux và Windows).
Bây giờ tôi cần triển khai một tính năng mới và bản dựng mới của tôi không còn chạy nữa.
Tôi có các hàm CUrl khác sử dụng POST và kết quả cũng như vậy: không có vấn đề gì, nhưng hàm GET của tôi không có vấn đề gì.
Tôi có một máy tính khác (với Mint 19) và chương trình chạy rất mượt, nhưng trên máy tính của tôi (cũng với Mint 19), nó biên dịch không có vấn đề gì, nhưng nó khởi động Curl.exec (Tôi đang sử dụng Qtcurl
Thư viện và các cuộc gọi nội bộ Curl_easy_perform
) và không bao giờ quay trở lại.
Tôi đã cài đặt gói này: libcurl4-openssl-dev
Có thể biên dịch chương trình của tôi (Linux và Windows). Chương trình này chạy trên Windows.
Vấn đề của tôi chỉ là phiên bản mới trong Mint19.
Cài đặt còn thiếu gì?
Url QUrl("https://pos-api.ifood.com.br/oauth/token");
QUrlQuery q;
q.addQueryItem("client_id", id);
q.addQueryItem("client_secret", bí mật);
q.addQueryItem("grant_type","password");
q.addQueryItem("tên người dùng", người dùng);
q.addQueryItem("mật khẩu", mật khẩu);
url.setQuery(q);
QtCUrl::Tùy chọn lựa chọn;
opt[CURLOPT_URL] = url;
opt[CURLOPT_POST] = đúng;
opt[CURLOPT_FOLLOWLOCATION] = đúng;
opt[CURLOPT_FAILONERROR] = true;
opt[CURLOPT_SSL_VERIFYPEER]= sai // cửa sổ
Tiêu đề QStringList;
tiêu đề
<< "kiểm soát bộ đệm: không có bộ đệm"
<< "loại nội dung: ứng dụng/x-www-form-urlencoded";
opt[CURLOPT_HTTPHEADER] = tiêu đề;
val = cUrl.exec(opt); // VẤN ĐỀ TẠI ĐÂY!!!!
if (cUrl.lastError().isOk()) {
bool được rồi;
// json là một QString chứa dữ liệu JSON
QtJson::JsonObject result = QtJson::parse(val, ok).toMap();
token=result["access_token"].toString();
return token;
}
khác {
trở lại "";
}
Tôi đã thay đổi tất cả các phương pháp của mình.
Hàm đầu tiên là POST với một truy vấn.
QString iFood_getToken2(Mã thông báo QString, int *expira, QString id, QString bí mật, người dùng QString, mật khẩu QString, máy chủ QString){
if(host!=tên máy chủ || !ifood_ativo){
qDebug() << "iFood_getToken2 saindo...";
trở lại "";
}
if(*expira>IFOOD_TASK){
*expira-=IFOOD_TASK;
// qDebug() << "expira " << *expira;
trả lại token; // token válido
}
Url QUrl("https://pos-api.ifood.com.br/oauth/token");
QUrlQuery q;
q.addQueryItem("client_id", id);
q.addQueryItem("client_secret", bí mật);
q.addQueryItem("grant_type","password");
q.addQueryItem("tên người dùng", người dùng);
q.addQueryItem("mật khẩu", mật khẩu);
url.setQuery(q);
Yêu cầu QNetworkRequest(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setAttribution(QNetworkRequest::CacheLoadControlAttribution, QVariant(int(QNetworkRequest::AlwaysNetwork)));
QJsonObject json;
QNetworkAccessManager nam;
QNetworkReply *reply = nam.post(request, QJsonDocument(json).toJson());
trong khi (!trả lời->isFinished())
{
qApp->processEvents();
}
QByteArray reply_data = reply->readAll();
QJsonDocument jsonr = QJsonDocument::fromJson(response_data);
trả lời->xóaLater();
//qDebug() << "ifoodtoken2 " << jsonr["access_token"].toString();
trả về jsonr["access_token"].toString();
}
Tôi đã triển khai các tính năng mới này:
Có một triển khai mới của GET và PATCH
Vậy là từ nay mình không cần dùng đến thư viện CUrl nữa
QJsonDocument networkGet(QString strUrl, QString token){
url QUrl(strUrl);
Yêu cầu QNetworkRequest(url);
request.setAttribution(QNetworkRequest::CacheLoadControlAttribution, QVariant(int(QNetworkRequest::AlwaysNetwork)));
QString headerData = "người mang" + mã thông báo;
request.setRawHeader("Ủy quyền", headerData.toLocal8Bit());
QJsonObject json;
QNetworkAccessManager nam;
QNetworkReply *reply = nam.get(request);
trong khi (!trả lời->isFinished())
{
qApp->processEvents();
}
QByteArray reply_data = reply->readAll();
QJsonDocument json_response = QJsonDocument::fromJson(response_data);
trả lời->xóaLater();
//qDebug() << "networkGet " << json_response << reply->errorString() << headerData;
trả về json_response;
}
int networkPatch(QString strUrl, mã thông báo QString, QJsonDocument json){
url QUrl(strUrl);
Yêu cầu QNetworkRequest(url);
request.setAttribution(QNetworkRequest::CacheLoadControlAttribution, QVariant(int(QNetworkRequest::AlwaysNetwork)));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QString headerData = "người mang" + mã thông báo;
request.setRawHeader("Ủy quyền", headerData.toLocal8Bit());
QNetworkAccessManager nam;
QByteArray * _b_arr = QByteArray mới (QString(json.toJson()).toLatin1());
QBuffer *_qbf_upload =QBuffer mới (_b_arr);
QNetworkReply *reply = nam.sendCustomRequest(request,"PATCH",_qbf_upload);
trong khi (!trả lời->isFinished())
{
qApp->processEvents();
}
QByteArray reply_data = reply->readAll();
QJsonDocument json_response = QJsonDocument::fromJson(response_data);
trả lời->xóaLater();
qDebug() << "networkPatch" << reply->error() << json_response << reply->errorString() << headerData;
trả lời trả lời->lỗi();
}
Tôi là một lập trình viên xuất sắc, rất giỏi!