2013-07-21 1 views
0

Я знаю, что этот вопрос задан много раз, однако в моем случае предлагаемые коды и решения не разрезают его. Сеть ответ до сих пор мой случай пуст, и код ошибки 0.Qt ответ сети пуст

Вот моя функция:

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 и никто не вызываются. Почему это не работает в моем случае?

ответ

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 - это Q_SLOT, который вы должны определить в своем hpp. Затем переместите код в ваш 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(); 

} 

источники: QNetworkReply, BlackBerry Sample App Maven source code

 Смежные вопросы

  • Нет связанных вопросов^_^