0

我知道这个问题已经被问过很多次了,但是在我的情况下,建议的代码和解决方案并没有解决它。网络回复还是我的case为空,错误码为0。

这是我的功能:

QString NWork::send(QVector<QString> &data) const{
//QNetworkAccessManager qnam = new QNetworkAccessManager();
QNetworkAccessManager qnam;
try{
    QString json = NWork::to_JSON(data);
    QByteArray json_data(json.toUtf8());
    QNetworkRequest request;

    request.setUrl(QUrl(NWork::connection));

    request.setRawHeader("Content-Type", "application/json");
    request.setRawHeader("Content-Length", json_data);

    reply = qnam.post(request, json_data);
    //reply = qnam.get(request);
    int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    QString s(reply -> readAll());

    qDebug()<<"code "<<status<<"Content "<<s;

    //return QString::fromUtf8(response.data(),response.size());
}catch(std::exception x){
    std::cout<<x.what()<<std::endl;
}
return "";
}

将许多人建议的形式联系起来

connect(qnam,SIGNAL(destroyed(QNetworkReply*)),this,SLOT(read(QNetworkReply*)));

对所有人都没有影响。请求到达 PHP 脚本,我通过将请求数据写入文件来知道这一点。它对每个请求都这样做。即使使用 text/html 标头也无法回显任何内容。

是的,我已经用 HTML AJAX 请求程序尝试了我的 PHP 脚本,它可以工作。它写入文件,并向浏览器返回响应。两种情况下的代码相同。

这是我的 PHP 代码:

header("Access-Control-Allow-Origin: *");
$k = file_get_contents("php://input");
$file = "/file/path/log.k";
//echo $file;
$handle = fopen($file, "a+");
if($handle){
    echo $k;
    fwrite($handle, $k."\n");
    fclose($handle);
}
header("Content-Type: text/html");
echo "line 22 ".$que;
exit(0);

我检查了我的 apache2 错误日志,没有一个被调用。为什么它在我的情况下不起作用?

4

1 回答 1

1

我知道这是近一年的问题,但我刚开始自学 Qt,最近我也遇到了这个问题,并被购买到这个页面。所以对于那些也被困在这个问题上的人,这就是我解决它的方法。

首先更改连接:

connect(qnam,SIGNAL(destroyed(QNetworkReply*)),this,SLOT(read(QNetworkReply*)));

至:

connect(reply, SIGNAL(finished()), this, SLOT(onReply()));

然后在 post 调用之后将其添加到您的代码中,如下所示:

reply = qnam.post(request, json_data);
connect(reply, SIGNAL(finished()), this, SLOT(onReply()));

finished 方法是 QNetworkReply 信号的一部分,并在回复完成时触发。SLOT 内部的方法是一个 Q_SLOT,你必须在你的 hpp.xml 中定义它。然后将您的代码移动到您的 onReply 方法,它看起来类似于:

 QNetworkReply* reply = qobject_cast<QNetworkReply*>(sender());
 QString response = reply->readAll();

    if (reply)
    {
            if (reply->error() == QNetworkReply::NoError)
            {
                const int available = reply->bytesAvailable();
                if (available > 0)
                {
                    const QByteArray buffer = reply->readAll();
                    response = QString::fromUtf8(buffer);
                   // success = true;
                }
            }
            else
            {
                response =  tr("Error: %1 status: %2").arg(reply->errorString(), reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString());
            }

            qDebug()<<"code: "<<reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toString()<<" response: "<<response;
            reply->deleteLater();

}

来源:QNetworkReplyBlackBerry Sample App Maven 源代码

于 2014-05-03T22:23:33.997 回答