今天我們介紹一下QT的http請求,這裡有post和get兩種方式
一、post請求方式:參數分為網址和具體請求值兩個部分,有時候還需要設定頭資訊,看具體情況定
1 void MainWindow::sendPostRequest()
2 {
3 QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
4 //設定url
5 QString url = "http://10.0.0.20:8005/order/charge";
6 //設定頭資訊
7 QNetworkRequest requestInfo;
8 requestInfo.setUrl(QUrl(url));
9 requestInfo.setHeader(QNetworkRequest::ContentTypeHeader,QVariant("application/json"));
10 // requestInfo.setRawHeader("Content-Type","application/json");//伺服器要求的資料頭部
11 // requestInfo.setRawHeader("Accept","text/json,*/*;q=0.5");//伺服器要求的資料頭部
12
13 //發送資料
14 QByteArray qByteHttpData = sendJson();
15 QNetworkReply *reply = m_pHttpMgr->post(requestInfo, qByteHttpData);
16 //添加事件循環機制,傳回後再運作後面的
17 QEventLoop eventLoop;
18 connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
19 eventLoop.exec(); //block until finish
20
21 //錯誤處理
22 if (reply->error() == QNetworkReply::NoError)
23 {
24 qDebug() << "request protobufHttp NoError";
25 }
26 else
27 {
28 qDebug()<<"request protobufHttp handle errors here";
29 QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
30 //statusCodeV是HTTP伺服器的相應碼,reply->error()是Qt定義的錯誤碼,可以參考QT的文檔
31 qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
32 qDebug(qPrintable(reply->errorString()));
33 }
34
35 //請求收到的結果
36 QByteArray responseByte = reply->readAll();
37 }
二、get請求方式:參數和網址拼接到一起請求
1 void MainWindow::sendGetRequest()
2 {
3 QNetworkAccessManager *m_pHttpMgr = new QNetworkAccessManager();
4 //設定url
5 QString url = "http://10.0.0.20:8005/vending_machine/items/ac83f39ea268";//fae4b325e52c
6 QNetworkRequest requestInfo;
7 requestInfo.setUrl(QUrl(url));
8
9 //添加事件循環機制,傳回後再運作後面的
10 QEventLoop eventLoop;
11 QNetworkReply *reply = m_pHttpMgr->get(requestInfo);
12 connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
13 eventLoop.exec(); //block until finish
14 //錯誤處理
15 if (reply->error() == QNetworkReply::NoError)
16 {
17 qDebug() << "request protobufHttp NoError";
18 }
19 else
20 {
21 qDebug()<<"request protobufHttp handle errors here";
22 QVariant statusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
23 //statusCodeV是HTTP伺服器的相應碼,reply->error()是Qt定義的錯誤碼,可以參考QT的文檔
24 qDebug( "request protobufHttp found error ....code: %d %d\n", statusCodeV.toInt(), (int)reply->error());
25 qDebug(qPrintable(reply->errorString()));
26 }
27 //請求傳回的結果
28 QByteArray responseByte = reply->readAll();
29 qDebug() << responseByte;
30 }
三、主要差別:
get用于請求擷取資料,post向指定的資源建立修改資料
get把參數包含在URL中(長度有限制),POST通過請求實體傳遞參數(安全)
GET | POST | |
後退按鈕/重新整理 | 無害 | 資料會被重新送出(浏覽器應該告知使用者資料會被重新送出) |
書簽 | 可收藏為書簽 | 不可收藏為書簽 |
緩存 | 能被緩存 | 不能被緩存 |
編碼類型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded或multipart/form-data.為進制資料使用多重編碼 |
曆史 | 參數保留在浏覽器曆史中 | 參數不會保留在浏覽器曆史中 |
對資料長度的限制 | 是的。當發送資料時,GET方法向URL添加資料;URL的長度是受限制的(URL 的最大長度是2048個字元) | 無限制 |
對資料類型的限制 | 隻允許ASCII字元。 | 沒有限制。也允許二進制資料。 |
安全性 | POST相比,GET的安全性較差,因為所發送的資料是URL的一部分。 在發送密碼或其他敏感資訊時絕不要使用GET ! | POST比GET更安全,因為參數不會被儲存在浏覽器曆史或web伺服器日志中 |
可見性 | 資料在URL中對所有人都是可見的 | 資料不會顯示在URL中 |