我知道这个问题已被多次询问,但在我的案例中,建议的代码和解决方案并没有削减它。网络回复仍然是空的,错误代码是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标头回复任何内容也无法正常工作。
是的,我已经尝试了我的PHP脚本和HTML AJAX请求程序,它可以工作。它写入文件,并返回对浏览器的响应。两种情况下的代码相同。
这是我的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错误日志,并且没有调用任何日志。为什么我的情况不起作用?
答案 0 :(得分:1)
我知道这是近一年的问题,但我刚开始自学Qt,我最近也遇到了这个问题,并被收购到这个页面。所以对于那些也坚持这一点的人来说,我就是这样解决的。
首先更改连接:
connect(qnam,SIGNAL(destroyed(QNetworkReply*)),this,SLOT(read(QNetworkReply*)));
为:
connect(reply, SIGNAL(finished()), this, SLOT(onReply()));
然后在帖子调用后将其添加到您的代码中,如下所示:
reply = qnam.post(request, json_data);
connect(reply, SIGNAL(finished()), this, SLOT(onReply()));
完成的方法是QNetworkReply信号的一部分,并在回复完成时触发。 SLOT内部的方法是您必须在hpp中定义的Q_SLOT。然后将代码移动到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();
}