Qt4 如何使用QHttp实现post和get
生活随笔
收集整理的這篇文章主要介紹了
Qt4 如何使用QHttp实现post和get
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
nt頭文件:
// http.h #ifndef HTTP_H #define HTTP_H #include <QObject> #include <QBuffer> #include <QHttp> #include <QUrl>class Http: public QObject {Q_OBJECTpublic:Http(QObject *parent = 0);~Http();void setUrl(const QUrl &url);void setPort(quint16 port);void get();void post(const QString &script);bool error();QByteArray read();protected:QHttp *http;QUrl _url;QBuffer reply;quint16 _port;int _id;bool _error;protected slots:void requestStarted(int);void requestFinished(int, bool);void dataSendProgess(int, int);void dataReadProgess(int, int);void responseHeaderReceived();signals:void done(); }#endif // HTTP_H源文件:
// http.cpp #include "http.h" #include <iostream>Http::Http(QObject *parent):QObject(parent) {http = new QHttp(this);_port = 80;connect(http,SIGNAL(requestStarted(int)),this,SLOT(requestStarted(int)));connect(http,SIGNAL(requestFinished(int,bool)),this,SLOT(requestFinished(int,bool)));connect(http,SIGNAL(dataSendProgress(int,int)),this,SLOT(dataSendProgess(int,int)));connect(http,SIGNAL(dataReadProgress(int,int)),this,SLOT(dataReadProgess(int,int))); } Http::~Http() {delete http;disconnect(this);QObject::~QObject(); }void Http::setUrl(const QUrl &url) {_url = url;} void Http::setPort(quint16 port) {_port = port;} void Http::get() {http->setHost(_url.host(),_port);_id = http->get(_url.path(),&reply); } void Http::post(const QString &script) {http->setHost(_url.host(),_port);_id = http->post(_url.path(),script,&reply); } bool Http::error() {return _error;} QByteArray Http::read() {return reply;}void Http::requestStarted(int id) {if (id != _id)return;std::cout << "正在連接至服務器"<< qPrintable(_url.host())<< " ..." << std::endl; } void Http::requestFinished(int id, bool error) {if (id != _id)return;std::cout << "正在斷開與服務器"<< qPrintable(_url.host())<< "的連接 ..." << std::endl;if (!error)std::cout << "成功與"<< qPrintable(_url.host())<< "交換數據" << std::endl;else{switch (http->error()){case QHttp::HostNotFound: std::cerr << "找不到指定服務器"<< qPrintable(_url.host())<< std::endl;break;case QHttp::ConnectionRefused: std::cerr << "服務器"<< qPrintable(_url.host())<< "拒絕連接請求" << std::endl;break;case QHttp::UnexpectedClose: std::cerr << "與服務器"<< qPrintable(_url.host())<< "的連接被服務器意外地關閉" << std::endl;break;case QHttp::InvalidResponseHeader: std::cerr << "響應文件"<< qPrintable(_url.path())<< "無效" << std::endl;break;case QHttp::WrongContentLength: std::cerr << "數據長度失效" << std::endl;break;case QHttp::Aborted: std::cerr << "與服務器"<< qPrintable(_url.host())<< "的連接突然中斷" << std::endl;break;case QHttp::ProxyAuthenticationRequiredError: std::cerr << "與代理服務器的連接需要身份驗證" << std::endl;case QHttp::AuthenticationRequiredError: std::cerr << "與服務器"<< qPrintable(_url.host())<< "的連接需要身份驗證" << std::endl;break;default: std::cerr << "發生了一個未知錯誤" << std::endl;break;}} } void Http::dataSendProgess(int done, int total) {std::cout << "正在向服務器"<< qPrintable(_url.host())<< "發送數據 ..." << std::endl<< "總數據大小: " << total << "KB" << std::endl<< "已發送數據大小: " << done << "KB" << std::endl<< "待發送數據大小: " << total-done << "KB" << std::endl<< "已發送數據占比: " << 100*done/total << "%" << std::endl<< "待發送數據占比: " << 100-100*done/total << "%" << std::endl; } void Http::dataReadProgess(int done, int total) {std::cout << "正在從服務器"<< qPrintable(_url.host())<< "接受數據 ..." << std::endl;if (total)std::cout << "總數據大小: " << total << std::endl;std::cout << "已接受數據大小: " << done << std::endl;if (total)std::cout << "待接收數據大小: " << total-done << std::endl<< "已接受數據占比: " << 100*done/total << "%" << std::endl<< "待接受數據占比: " << 100-100*done/total << "%" << std::endl; }代碼自己理解吧,這里發一個QHttp幫助文檔的鏈接,可以自己去看一看,不過是全英文的,可以用瀏覽器翻譯。這里給出一張post過程的流程圖。
Created with Rapha?l 2.2.0開始執行post發射requestStarted(id)信號是否找到指定服務器指定文件是否有效上傳數據發射dataSendProgress(done,total)信號數據是否上傳完畢發射responseHeaderReceived(responseHeader)信號發射dataReadProgress(done,total)信號數據是否接受完畢發射readyRead()信號發射requestFinished(id,true)信號發射done(true)信號結束發射requestFinished(id,false)信號發射done(false)信號yesnoyesnoyesnoyesno總結
以上是生活随笔為你收集整理的Qt4 如何使用QHttp实现post和get的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++类的使用(一)
- 下一篇: C++类的使用(二)—— explici