• 9057阅读
  • 8回复

用Qhttp来post访问webserver问题 [复制链接]

上一主题 下一主题
离线rxpeng
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-25
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
我想在关闭mainframe时给服务器一个信息:“我已经下线”

我在mainframe的closeEvent()的代码如下:
void MainWindow::closeEvent(QCloseEvent *event)
{
    int re = QMessageBox::information(this,tr("信息"),tr("are you sure to close?"),QMessageBox::Cancel,QMessageBox::Ok);
    switch(re)
    {
    case QMessageBox::Ok:
        {
            QString data = this->ui->datelineEdit->text();
             qDebug() << "Post Data: " << data << "\n";
            QString get_h = "192.168.1.110";
            http->setHost(get_h);
            QString get_p = this->ui->pathlineEdit->text();

            http->post(get_p, data.toUtf8());

            http->get(get_p);
            QHttpRequestHeader header("POST",get_p) ;
            header.setValue("Host",get_h) ;
            header.setContentType("application/x-www-form-urlencoded");
            http->request(header, data.toUtf8()) ;
            event->accept();
            break;
        }
    case QMessageBox::Cancel:
        event->ignore();
        break;
    default:
        break;
    }
}

当我点击关闭按钮后,得到以下的信息:


1  Request Finished

successfully

2  Request Finished

with errors

"Request aborted"

"Request aborted"

也就时说连接被中断了!!!数据没被发出去
不知道该怎么写?

希望大家给解决下,小妹在此谢过拉!!!!
离线dbzhang800

只看该作者 1楼 发表于: 2010-08-25
你要求的不就是“等它发完再退出么?“,按你想的做就行了
离线rxpeng
只看该作者 2楼 发表于: 2010-08-25
对阿
但是,那样不对阿
退出后就终止了阿!
不知道怎么做?
离线dbzhang800

只看该作者 3楼 发表于: 2010-08-25
引用第2楼rxpeng于2010-08-25 18:15发表的  :
对阿
但是,那样不对阿
退出后就终止了阿!
不知道怎么做?

等它"发完"再退出。发完不是会有信号么?但你代码中没这么做,
离线rxpeng
只看该作者 4楼 发表于: 2010-08-25
#include <QtCore/QString>
#include <QtDebug>

#include "MainWindow.h"
#include <QTime>
#include <QtGui>


MainWindow::MainWindow()
{

    ui = new Ui::MainWindow;
    ui->setupUi(this);

    http = new QHttp();
    http->setObjectName("http");

    connect(http, SIGNAL(done(bool)), this, SLOT(on_http_done(bool)));
    connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(on_http_requestFinished(int, bool)));

    ui->hostlineEdit->setText("192.168.1.104");
    ui->datelineEdit->setText("user_name=111&state=true");
    ui->pathlineEdit->setText("/user_data/send_closed.php");

    this->r_ok = false;
}

MainWindow::~MainWindow()
{
    /*
    file->close();
    delete file;
    */
    delete http;
}

void MainWindow::on_http_done(bool error)
{
    if (error)
    {
        qDebug() << http->errorString() << "\n";
    }
    else
    {
        qDebug() << "Session finished successfully\n";
        //buffer.close();
              httptext = http->readAll();  //得到返回数据
            int sec = this->t->msec();
        qDebug() << "Received Size: " << httptext.count() << "\n";  //打印出来
        qDebug()<<"the all time:"<<sec<<"ms";
        QString time_str;
        time_str.setNum(sec);
        this->ui->label_5->setText(time_str + "ms");
        QString strSource(httptext);//转换成字符串
        ui->TextEditHttp->setPlainText(strSource);//显示在白布上
    }
}

void MainWindow::on_http_requestFinished(int id, bool error)
{
    qDebug() << id <<" Request Finished\n";

    if (error)
    {
        qDebug() << "with errors\n";
        qDebug() << http->errorString() << "\n";
    }
    else
    {
        qDebug() << " successfully \n";
        this->r_ok = true;
    }
}

void MainWindow::on_PushButtonPost_clicked()
{
    QString data = this->ui->datelineEdit->text();//"user_name=111&pawd=111"
     qDebug() << "Post Data: " << data << "\n";
    QString get_h = "192.168.1.110";
    http->setHost(get_h);
    QString get_p = this->ui->pathlineEdit->text();//"/user_data/check.php"

   // http->post(get_p, data.toUtf8());

    http->get(get_p);
    QHttpRequestHeader header("POST",get_p) ;
    header.setValue("Host",get_h) ;
    header.setContentType("application/x-www-form-urlencoded");
   // http->request(header, data.toUtf8()) ;

    t = new QTime();
    t->start();
}


void MainWindow::closeEvent(QCloseEvent *event)
{
    int re = QMessageBox::information(this,tr("信息"),tr("are you sure to close?"),QMessageBox::Cancel,QMessageBox::Ok);
    switch(re)
    {
    case QMessageBox::Ok:
        {
            QString data = this->ui->datelineEdit->text();//"user_name=111&pawd=111"
             qDebug() << "Post Data: " << data << "\n";
            QString get_h = "192.168.1.110";
            http->setHost(get_h);
            QString get_p = this->ui->pathlineEdit->text();//"/user_data/check.php"

            http->post(get_p, data.toUtf8());

          //  http->get(get_p);
            QHttpRequestHeader header("POST",get_p) ;
            header.setValue("Host",get_h) ;
            header.setContentType("application/x-www-form-urlencoded");
          //  http->request(header, data.toUtf8()) ;
            if(this->r_ok)
                event->accept();
            break;
        }
    case QMessageBox::Cancel:
        event->ignore();
        break;
    default:
        break;
    }
}

我在on_http_requestFinished中加了个bool变量来判断,但是调试信息中:
1  Request Finished

successfully

2  Request Finished

with errors

"Request aborted"

"Request aborted"

只要有一次成功就退出了,也是还没到发完就退出了,大哥麻烦详细点,谢谢拉
离线rxpeng
只看该作者 5楼 发表于: 2010-08-25
已经搞定,在此十分感谢dbzhang800给于我的帮组!
离线uidab

只看该作者 6楼 发表于: 2011-02-16
回 5楼(rxpeng) 的帖子
能给说一下吗??
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线uidab

只看该作者 7楼 发表于: 2011-02-23
回 3楼(dbzhang800) 的帖子
能给详细说说吗?
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线l270378034

只看该作者 8楼 发表于: 2011-03-10
怎么调用web server中的函数
linux_qt
快速回复
限100 字节
 
上一个 下一个