標籤:qt http post 網路通訊
最近在搞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_OBJECTpublic: 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();}