Qt通過QNetworkAccessManager實現Http網絡通信

   最近在搞Qt的網絡通信和音樂播放的應用,做完每一個部分都會上傳上來。下面的這段代碼中實現了訪問百度主頁,返回的信息可以再輸出窗查看,代碼中註釋的部分是上傳文件用的。QNetworkAccessManager是Qt4.4裏才引入的類,qt4,.4之前一般都是使用QHttp實現。

類申明:

#ifndef DIALOG_H
#define DIALOG_H
#include <QtGui/QDialog>
#include <QNetworkAccessManager>
#include <QFile>
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QPushButton>
#include <QHBoxLayout>
#include <QIODevice>

/********************HTTP實現通信******************************/
/*************************************************************/
/*************************************************************/
/*************************************************************/
class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();
protected slots:
    void httpDownload();
    void replyFinished(QNetworkReply*reply);
    void onUploadProgress(qint64 bytesSent,qint64 butesTotal);

private:
    QPushButton *download_Btn;
    QFile *file;
    QNetworkAccessManager *accessManager;
    QNetworkRequest request;
    QNetworkReply *reply;
    QHBoxLayout *layout;



};




#endif // DIALOG_H


類的實現:

#include "dialog.h"
#include<QtDebug>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    download_Btn=new QPushButton("download");
    layout=new QHBoxLayout();
    layout->addWidget(download_Btn);
    layout->sizeHint().height();
    setLayout(layout);

    connect(download_Btn,SIGNAL(clicked()),this,SLOT(httpDownload()));

}

Dialog::~Dialog()
{

}
void Dialog::httpDownload(){
    //QUrl url("http://localhost:8080/uploadtest/MyUpload");
    QUrl url("http://www.baidu.com");
    QByteArray post_data;//上傳的數據可以是QByteArray或者file類型
    post_data.append("hello");
    file=new QFile("/home/vino/Desktop/a.txt");
    file->open(QIODevice::ReadOnly);//只讀方式打開文件
    accessManager=new QNetworkAccessManager(this);

    request.setUrl(url);
    /******************設置http的header***********************/
   // request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data");
   // request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");//上傳文件
   // request.setRawHeader("Content-Disposition","form-data;name='doc';filename='a.txt'");
    //request.setHeader(QNetworkRequest::ContentLengthHeader,post_data.length());


    connect(accessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));//finish爲manager自帶的信號,replyFinished是自定義的
    reply=accessManager->post(request,post_data);//通過發送數據,返回值保存在reply指針裏.

    //connect(reply, SIGNAL(uploadProgress ( qint64 ,qint64 )), this, SLOT( onUploadProgress(qint64 ,qint64 ));//上傳文件時進度
    //void QNetworkReply::downloadProgress ( qint64 bytesReceived, qint64 bytesTotal )  qt也有提供下載文件的進度	




}
void Dialog::replyFinished(QNetworkReply *reply){
    //獲取響應的信息,狀態碼爲200表示正常
    QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);

    //無錯誤返回
    if(reply->error() == QNetworkReply::NoError)
    {
        download_Btn->setText("success");
        QByteArray bytes = reply->readAll();  
        QString result(bytes);  //轉化爲字符串
        qDebug()<<result;
    }
    else
    {
        //處理錯誤
         download_Btn->setText("failed");
    }

    reply->deleteLater();//要刪除reply,但是不能在repyfinished裏直接delete,要調用deletelater;

}

void Dialog::onUploadProgress(qint64 bytesSent, qint64 butesTotal){
 	//文件上傳的進度

}


主函數:由Qtcreator自動生成


#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();
    return a.exec();
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章