以VS開發為例。因為https訪問需要用到SSL認證,而QT默認是不支持SSL認證,所以在使用之前必須先做一些准備工作:
需要安裝OpenSSL庫:
1、首先打開http://slproweb.com/products/Win32OpenSSL.html網頁;
2、下載安裝包,我下載的是:Win32 OpenSSL v1.0.1c Light安裝包,隨着時間的推進,這個版本會不斷更新的;
3、安裝(exe文件)到本地,並且在安裝過程中選擇將庫安裝到OpenSSL的安裝目錄(/bin)下面。
4、將libeay32.dll 和 ssleay32.dll 文件拷貝到Qt中的存放有QtNetwork4.dll和QtNetworkd4.dll的文件目錄下。我的是D:\Qt\4.8.2\bin
現在可以編寫代碼:
1 QNetworkRequest request; 2 QSslConfiguration config; 3 4 QSslConfiguration conf = request.sslConfiguration(); 5 conf.setPeerVerifyMode(QSslSocket::VerifyNone); 6 conf.setProtocol(QSsl::TlsV1SslV3); 7 request.setSslConfiguration(conf);
上面三句添回檢驗證書模式與協議,並設置給對應QNetworkRequest,非常重要,在這里花費了我半天的時間才找到問題
1 request.setUrl(QUrl("https://www.xxx.com/html.jsp")); 2 request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json")); 3 request.setHeader(QNetworkRequest::ContentLengthHeader, bytePost.length()); 4 QNetworkReply *pReply = pManager->post(request, bytePost);
備注:
SSL證書認證,有以下三種:
1.
1 QSslConfiguration config ; 2 3 config.setPeerVerifyMode(QSslSocket::VerifyNone); 4 config.setProtocol(QSsl::TlsV1); 5 6 QNetworkRequest request(req); 7 request.setSslConfiguration(config);
2.
1 QNetworkRequest request ; 2 3 request.setAttribute(QNetworkRequest::HttpPipeliningAllowedAttribute, true); 4 QNetworkReply* reply = QNetworkAccessManager::createRequest(op, request, outgoingData); 5 reply->ignoreSslErrors();
3.
1 QSslConfiguration config ; 2 3 QList<QSslCertificate> certs = QSslCertificate::fromPath("C:\\FiddlerRoot.crt"); 4 config.setCaCertificates(certs); 5 6 QNetworkRequest request(req); 7 request.setSslConfiguration(config);