QNetworkRequest возвращает ноль
Так как это мой первый вопрос здесь, я прошу вас заранее извиниться, если нарушите какое-либо правило, касающееся вопросов.
Я должен использовать сообщение для сценария Google (см. Ниже), и я хочу в конце сценария получить от него обратную связь, что все прошло хорошо.
function doPost(e){
var idm = e.parameter.idm;
var sheet_purchaseHistory = SpreadsheetApp.getActive().getSheetByName('purchaseHistory');
var date = new Date();
var time = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
sheet_purchaseHistory.getRange(sheet_purchaseHistory.getLastRow()+1, 1).setValue(time);
sheet_purchaseHistory.getRange(sheet_purchaseHistory.getLastRow(), 2).setValue(mailadress);
return ContentService.createTextOutput(JSON.stringify({'status': 'success'})).setMimeType(ContentService.MimeType.JSON);
}
В моем коде cpp у меня есть:
заголовок (.h)
QNetworkRequest request;
QNetworkAccessManager *manager;
QByteArray ba;
QNetworkReply* reply;
Конструктор:
manager = new QNetworkAccessManager(this); // I tried with and without parsing the (this)
request.setUrl(QUrl("https://script.google.com/macros/s/AKfycbzhHBpZ8jMfa2bwE_A0lQJNqOzVl894dcjkch_-0mNC6EX9usn1/exec"));
Внутри функции:
manager->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QUrlQuery postData;
postData.addQueryItem("idm", "string");
QNetworkReply *rp = manager->post(request,postData.toString(QUrl::FullyEncoded).toUtf8());
QEventLoop loop;
connect(rp, SIGNAL(finished()), &loop, SLOT(quit())); //readready SIGNAL also tried
loop.exec();
QByteArray data = rp->readAll();
QString dataReply(data);
qDebug() << dataReply;
Что происходит, так это то, что я всегда получаю ноль. Я уже пробовал несколько комбинаций, таких как разные сигналы (готовый, законченный...), используя QUrlQuery и ByteArray, устанавливая разные заголовки, но безуспешно.
Я также заметил, что когда мои параметры находятся в моем запросе ( https: // адрес? Параметры = строка), я могу получить возврат. (В этом случае, удалив параметры из "postdate" и включив их в post "req"
QNetworkReply *rep = man->post(req,postdata);
ПЕЧАТЬ RESTEStTEST: я пытался опубликовать с использованием https://resttesttest.com/, и он работал правильно. Это дало следующие комментарии
Может ли кто-нибудь помочь мне, пожалуйста?
1 ответ
С помощью следующей команды, использующей curl, я смог проанализировать запрос:
curl --trace-ascii output.txt \
-d "idm=0123" \
-L "https://script.google.com/macros/s/AKfycbzhHBpZ8jMfa2bwE_A0lQJNqOzVl894dcjkch_-0mNC6EX9usn1/exec"
В файле.txt есть следующая строка:
# ...
== Info: Issue another request to this URL: 'https://script.googleusercontent.com/macros/echo?user_content_key=odFvp9PfkjN-H6-IhBUWhj1XC4LbgGXq3moew78NtUkeQAI4UCwjEaz33jH1p_VSrMLvl9R-1p2f-LCuIURpcA9ynEuB76Kdm5_BxDlH2jW0nuo2oDemN9CCS2h10ox_1xSncGQajx_ryfhECjZEnDmqvNuuY9_pIuNLYjrNDt9AJiVy2Q9_jt9ucsQKYIYmzKj2_WuA-BZmfTxlnQZT_cbqvF_hZXXo&lib=MbJJIMSCHwBgrN--y_1G9PbYl-ov70HvX'
== Info: Switch from POST to GET
# ...
Это говорит нам о том, что в перенаправлении изменяется с POST на GET, поэтому он не учитывается с атрибутом QNetworkRequest::NoLessSafeRedirectPolicy, который продолжает попытки с POST. Таким образом, решение состоит в том, чтобы обрабатывать перенаправление вручную.
QNetworkAccessManager manager;
QNetworkRequest request;
QUrl url("https://script.google.com/macros/s/AKfycbzhHBpZ8jMfa2bwE_A0lQJNqOzVl894dcjkch_-0mNC6EX9usn1/exec");
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QUrlQuery postData;
postData.addQueryItem("idm", "string");
QNetworkReply *reply_post = manager.post(request, postData.toString(QUrl::FullyEncoded).toUtf8());
QEventLoop loop;
QObject::connect(reply_post, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
QNetworkRequest redirect_request;
redirect_request.setUrl(reply_post->attribute(QNetworkRequest::RedirectionTargetAttribute).toUrl());
reply_post->deleteLater();
QNetworkReply *reply_get = manager.get(redirect_request);
QObject::connect(reply_get, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
qDebug()<< reply_get->readAll();
reply_get->deleteLater();
Выход:
OK