首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QNetworkRequest返回空

QNetworkRequest返回空
EN

Stack Overflow用户
提问于 2018-12-02 16:11:05
回答 1查看 420关注 0票数 2

我必须使用post的谷歌脚本(见下文),我希望在脚本的结尾,从它收到反馈,一切顺利。

代码语言:javascript
复制
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)

代码语言:javascript
复制
QNetworkRequest request;
QNetworkAccessManager *manager;
QByteArray ba;
QNetworkReply* reply;

构造者:

代码语言:javascript
复制
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"));

在一个函数中:

代码语言:javascript
复制
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;

结果是我总是收到null。我已经尝试过几种组合,比如不同的信号(读好了,完成了.),使用QUrlQuery和ByteArray,设置了不同的头,但是没有成功。

我还注意到,当参数在我的请求(https://address?parameters=string)中时,我可以接收返回。(在这种情况下,方法是从"postdate“中移除参数并将它们包含在post”req“中。

代码语言:javascript
复制
QNetworkReply *rep = man->post(req,postdata);

RESTEStTEST打印:我试着使用https://resttesttest.com/发布文章,它正常工作。它发表了以下评论

有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-03 01:14:29

在以下命令的帮助下,我可以使用curl分析请求:

代码语言:javascript
复制
curl  --trace-ascii  output.txt \
      -d "idm=0123" \
      -L "https://script.google.com/macros/s/AKfycbzhHBpZ8jMfa2bwE_A0lQJNqOzVl894dcjkch_-0mNC6EX9usn1/exec" 

在.txt文件中有以下一行:

代码语言:javascript
复制
# ...
== 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,因此在继续尝试POST的属性QNetworkRequest::NoLessSafeRedirectPolicy中没有考虑到它。因此,解决方案是手动处理重定向。

代码语言:javascript
复制
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();

输出:

代码语言:javascript
复制
OK
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53582106

复制
相关文章

相似问题

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