• 22788阅读
  • 14回复

【原创】使用QHttp POST数据 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-12-15
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
有需要对某个网址POST数据,想练习使用Qt来做,记得以前使用C#的时候搞过这个东西,那么Qt里应该也有,经过八个小时的摸索,终于搞定了使用QHttp Post数据,查手册,查QtForum,弯路走了不少,总归成功了。现在把代码贴出来。
main.cpp

#include <QtGui/QApplication>
#include "MainWindow.h"
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    MainWindow mainwindow;
    mainwindow.show();
    return app.exec();
}


MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include <QtCore/QByteArray>
//#include <QtCore/QBuffer>
#include <QtCore/QFile>
#include <QtNetwork/QHttp>
#include <QtNetwork/QHttpResponseHeader>
#include <QtNetwork/QHttpRequestHeader>
#include "ui_MainWindow.h"

class MainWindow : public QMainWindow, Ui::MainWindow
{
    Q_OBJECT
public:
    MainWindow();
    ~MainWindow();
public slots:
    void on_PushButtonPost_clicked();
    void on_http_stateChanged(int stat);
    void on_http_dataReadProgress(int done, int total);
    void on_http_dataSendProgress(int done, int total);
    void on_http_done(bool error);
    void on_http_requestFinished(int id, bool error);
    void on_http_requestStarted(int id);
    void on_http_responseHeaderReceived(const QHttpResponseHeader &resp);
public:
    QHttp *http;
    QFile *file;
    QByteArray httptext;
//     QBuffer buffer;
};

#endif // MAINWINDOW_H


MainWindow.cpp


#include <QtCore/QString>
#include <QtDebug>

#include "MainWindow.h"

MainWindow::MainWindow()
{
    setupUi(this);
    http = new QHttp();
    http->setObjectName("http");
    connect(http, SIGNAL(stateChanged(int)), this, SLOT(on_http_stateChanged(int)));
    connect(http, SIGNAL(dataReadProgress(int, int)), this, SLOT(on_http_dataReadProgress(int, int)));
    connect(http, SIGNAL(dataSendProgress(int, int)), this, SLOT(on_http_dataSendProgress(int, int)));
    connect(http, SIGNAL(done(bool)), this, SLOT(on_http_done(bool)));
    connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(on_http_requestFinished(int, bool)));
    connect(http, SIGNAL(requestStarted(int)), this, SLOT(on_http_requestStarted(int)));
    connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(on_http_responseHeaderReceived(const QHttpResponseHeader &)));
   
    /*
    file = new QFile("/home/bjp/workspace/AutoVote/index.html");
    file->open(QIODevice::WriteOnly);
    */
}

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

void MainWindow::on_http_stateChanged(int stat)
{
    switch (stat)
    {
        case QHttp::Unconnected : qDebug() << "Unconnected\n" ;
              break;
        case QHttp::HostLookup : qDebug() << "HostLookup\n" ;
              break;
        case QHttp::Connecting : qDebug() << "Connecting\n" ;
              break;
        case QHttp::Sending : qDebug() << "Sending\n" ;
              break;
        case QHttp::Reading : qDebug() << "Reading\n" ;
              break;
        case QHttp::Connected : qDebug() << "Connected\n" ;
              break;
        case QHttp::Closing : qDebug() << "Closing\n" ;
              break;
    }
}

void MainWindow::on_http_dataReadProgress(int done, int total)
{
    qDebug() << "Downloaded " << done << " bytes " << " out of " << total << "\n";
}

void MainWindow::on_http_dataSendProgress(int done, int total)
{
    qDebug() << "Sended " << done << " bytes " << " out of " << total << "\n";
}

void MainWindow::on_http_done(bool error)
{
    if (error)
    {
        qDebug() << http->errorString() << "\n";
    }
    else
    {
        qDebug() << "Session finished successfully\n";
        //buffer.close();
              httptext = http->readAll();
        qDebug() << "Received Size: " << httptext.count() << "\n";
        QString strSource(httptext);
        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";
    }
}

void MainWindow::on_http_requestStarted(int id)
{
    qDebug() << "Request Started\n";
}

void MainWindow::on_http_responseHeaderReceived(const QHttpResponseHeader &resp)
{
    qDebug() << "HTTP response header received \n";
}

void MainWindow::on_PushButtonPost_clicked()
{
    QString data("name=你好中国&id=1234567890&addr=asdfghjkl");
    //http.post("http://localhost/biselaw/SalesReport.xml", data, &file);

    /*
    buffer.setData(httptext);
    buffer.open(QIODevice::WriteOnly);
    */
    qDebug() << "Post Data: " << data << "\n";
    http->setHost("localhost");
    //http->post("/biselaw/vote.php", data.toUtf8());

    QHttpRequestHeader header("POST", "/biselaw/vote.php") ;
    header.setValue("Host", "localhost") ;
    header.setContentType("application/x-www-form-urlencoded");
    http->request(header, data.toUtf8()) ;


    //QString strBuffer(httptext);
    //TextEditHttp->setHtml(strBuffer);
}


MainWindow.ui

<ui version="4.0" >
<author></author>
<comment></comment>
<exportmacro></exportmacro>
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow" >
<property name="geometry" >
  <rect>
  <x>0</x>
  <y>0</y>
  <width>552</width>
  <height>449</height>
  </rect>
</property>
<property name="windowTitle" >
  <string>MainWindow</string>
</property>
<widget class="QWidget" name="centralWidget" >
  <widget class="QPushButton" name="PushButtonPost" >
  <property name="geometry" >
  <rect>
    <x>430</x>
    <y>20</y>
    <width>88</width>
    <height>31</height>
  </rect>
  </property>
  <property name="text" >
  <string>Post</string>
  </property>
  </widget>
  <widget class="QTextEdit" name="TextEditHttp" >
  <property name="geometry" >
  <rect>
    <x>20</x>
    <y>60</y>
    <width>521</width>
    <height>381</height>
  </rect>
  </property>
  </widget>
</widget>
</widget>
<pixmapfunction></pixmapfunction>
<resources/>
<connections/>
</ui>


ex_http.pro

######################################################################
# Automatically generated by qmake (2.00a) 二 12月 13 23:51:48 2005
######################################################################

TEMPLATE = app
TARGET +=
DEPENDPATH += .
INCLUDEPATH += .
QT += network

# Input
HEADERS += MainWindow.h
FORMS += MainWindow.ui
SOURCES += main.cpp MainWindow.cpp


http://localhost/biselaw/vote.php文件

<?php
$somecontent = "name=" . $_POST['name'] . "&id=" . $_POST['id'] . "&addr=" . $_POST['addr'];
echo($somecontent);
?>

好了,现在凌晨五点半,赶紧睡觉,要不然早上又干不了事情了。
[ 此贴被XChinux在2005-12-15 05:35重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 1楼 发表于: 2005-12-15
但是我不明白的是,为什么我不能使用post()函数成功POST数据,非得构造一个QHttpRequestHeader,然后使用request()方法才能成功POST数据。哪位能解答一下为什么使用post()函数不能成功发送数据?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线iamone

只看该作者 2楼 发表于: 2005-12-28
似乎是http协议规定的,需要有一个头
离线scerzz

只看该作者 3楼 发表于: 2007-03-04
不知道怎么用qhttp上传一个文件啊
离线5706046

只看该作者 4楼 发表于: 2009-05-10
牛气
引用楼主XChinux于2005-12-15 05:29发表的 【原创】使用QHttp POST数据 :
有需要对某个网址POST数据,想练习使用Qt来做,记得以前使用C#的时候搞过这个东西,那么Qt里应该也有,经过八个小时的摸索,终于搞定了使用QHttp Post数据,查手册,查QtForum,弯路走了不少,总归成功了。现在把代码贴出来。
main.cpp
好了,现在凌晨五点半,赶紧睡觉,要不然早上又干不了事情了。
离线5706046

只看该作者 5楼 发表于: 2009-05-10
先收藏了,再研究,多谢了
离线huweixiong
只看该作者 6楼 发表于: 2009-06-08
学习精神可嘉
离线5706046

只看该作者 7楼 发表于: 2009-07-08
引用第6楼huweixiong于2009-06-08 15:09发表的  :
学习精神可嘉

你也做这个方面嘛?多多交流!我也在琢磨这个问题
离线5706046

只看该作者 8楼 发表于: 2009-07-08
如果是在网页上提交数据呢?那会怎么样呢?
离线5706046

只看该作者 9楼 发表于: 2009-07-09
#include <QtCore/QString>
#include <QtDebug>
#include<QFile>
#include<QTextCodec>
#include<QHttpRequestHeader>
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{


        QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));//、、GB2312
    //setupUi(this);
    ui->setupUi(this);
    http = new QHttp();
    http->setObjectName("http");
    connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(on_PushButtonPost_clicked()));
    connect(http, SIGNAL(stateChanged(int)), this, SLOT(on_http_stateChanged(int)));
    connect(http, SIGNAL(dataReadProgress(int, int)), this, SLOT(on_http_dataReadProgress(int, int)));
    connect(http, SIGNAL(dataSendProgress(int, int)), this, SLOT(on_http_dataSendProgress(int, int)));
    connect(http, SIGNAL(done(bool)), this, SLOT(on_http_done(bool)));
    connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(on_http_requestFinished(int, bool)));
    connect(http, SIGNAL(requestStarted(int)), this, SLOT(on_http_requestStarted(int)));
    connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(on_http_responseHeaderReceived(const QHttpResponseHeader &)));

    /*
    file = new QFile("/home/bjp/workspace/AutoVote/index.html");
    file->open(QIODevice::WriteOnly);
    */
}
MainWindow::~MainWindow()
{
     delete http;
    delete ui;
}


void MainWindow::on_http_stateChanged(int stat)
{
    switch (stat)
    {
        case QHttp::Unconnected : qDebug() << "Unconnected\n" ;
              break;
        case QHttp::HostLookup : qDebug() << "HostLookup\n" ;
              break;
        case QHttp::Connecting : qDebug() << "Connecting\n" ;
              break;
        case QHttp::Sending : qDebug() << "Sending\n" ;
              break;
        case QHttp::Reading : qDebug() << "Reading\n" ;
              break;
        case QHttp::Connected : qDebug() << "Connected\n" ;
              break;
        case QHttp::Closing : qDebug() << "Closing\n" ;
              break;
    }
}

void MainWindow::on_http_dataReadProgress(int done, int total)
{
    qDebug() << "Downloaded " << done << " bytes " << " out of " << total << "\n";
}

void MainWindow::on_http_dataSendProgress(int done, int total)
{
    qDebug() << "Sended " << done << " bytes " << " out of " << total << "\n";
}

void MainWindow::on_http_done(bool error)
{
    if (error)
    {
        qDebug() << http->errorString() << "\n";
    }
    else
    {
        qDebug() << "Session finished successfully\n";
        //buffer.close();
              httptext = http->readAll();
              QFile file("mini.htm");
              file.open(QIODevice::WriteOnly);
              file.write(httptext);
              file.close();
              ui->textBrowser->setSource(QUrl::fromLocalFile("mini.htm"));
                ui->textBrowser->reload();
        qDebug() << "Received Size: " << httptext.count() << "\n";
        QString strSource(httptext);

        ui->textEdit->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";
    }
}

void MainWindow::on_http_requestStarted(int id)
{
    qDebug() << "Request Started\n";
}

void MainWindow::on_http_responseHeaderReceived(const QHttpResponseHeader &resp)
{
    qDebug() << "HTTP response header received \n";
    QString text;
    for(int i=0;i<resp.keys().size();i++)
    {
    text.append(resp.keys().at(i)+"\n");
   }
    text.append(resp.toString());
    ui->textEdit_2->setText(text);
}

void MainWindow::on_PushButtonPost_clicked()
{
    QString data("email=d1sfa@adf.com&forward=&passregtext=1&password=acd&repassword=acd&uFrom=friend&url=&username=acdf&welcome");
    qDebug() << "Post Data: " << data << "\n";
    http->setHost("www.abc.com");

    QHttpRequestHeader *header=new QHttpRequestHeader();
   header->setRequest("POST", "http://www.abc.com/task/user/regnext.php") ;


    header->setValue("Host", "www.abc.com") ;
    header->setContentType("multipart/form-data");
   header->setValue("username","abcd");
  header->setValue("userpass","acd");
   header->setValue("usertime" ,"30");
    header->setValue("forward","");
   header->setValue("url","http://www.abc.com/");
  //header.setValue("submit"," ");

   // http->request(*header , QUrl::toPercentEncoding(data)) ;
    QString *path=new QString("http://www.abc.com/task/user/regnext");
     http->post(*path,QUrl::toPercentEncoding(data.toUtf8())) ;

}
离线5706046

只看该作者 10楼 发表于: 2009-07-09
为什么我注册不成功呢?
离线lixinhua
只看该作者 11楼 发表于: 2009-08-06
int QHttp::post ( const QString & path, QIODevice * data, QIODevice * to = 0 )

Sends a post request for path to the server set by setHost() or as specified in the constructor.

path must be an absolute path like /index.html or an absolute URI like http://qtsoftware.com/index.html and must be encoded with either QUrl::toPercentEncoding() or QUrl::encodedPath().
离线ccdeath
只看该作者 12楼 发表于: 2010-04-25
很不错。加油。
离线morriszy

只看该作者 13楼 发表于: 2011-03-07
http://localhost/biselaw/vote.php文件

引用

<?php
$somecontent = "name=" . $_POST['name'] . "&id=" . $_POST['id'] . "&addr=" . $_POST['addr'];
echo($somecontent);
?>


老大,这部分是建立什么文件?  新手,不懂啊~
[ 此帖被morriszy在2011-03-07 19:40重新编辑 ]
VS2010+Qt4.7.0
离线bikong7

只看该作者 14楼 发表于: 2011-03-11
不错
快速回复
限100 字节
 
上一个 下一个