Qt5 HTTP GET方法

来源:互联网 发布:算法的含义 编辑:程序博客网 时间:2024/05/21 01:51

开发环境 Qt5.5.1、Qt Creator 3.5.1 

HTTP是超文本传输协议,它是一种文件传输协议。

Qt实现HTTP主要用到这三个类

(1)QNetworkAccessManager

The QNetworkAccessManager class allows the application to send network requests and receive replies.

该类允许应用发送网络请求并接收响应。

(2)QNetworkRequest

The QNetworkRequest class holds a request to be sent with QNetworkAccessManager.

该类包含了一个由QNetworkAccessManager发送的请求。

(3)QNetworkReply

The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.

该类包含接收到的数据部分和QNetworkAccessManager发送请求的头部。


代码实现

1、首先,在工程文件*.pro中添加 "Qt Network模块"

Qt += network

2、创建myNetworkObject类

(1)mynetworkobject.h

#ifndef MYNETWORKOBJECT_H
#define MYNETWORKOBJECT_H
#include <QObject>
#include <QNetworkAccessManager>
#include <QUrl>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QDebug>
#include <QImageReader>
class MyNetworkObject : public QObject
{
    Q_OBJECT
public:
    explicit MyNetworkObject(QObject *parent = 0);
    void get(QUrl url);
    void printAttribute(QNetworkReply *reply, QNetworkRequest::Attribute code, QString codeStr);
public slots:
    void finishedSlot(QNetworkReply *reply);
signals:
private:
    QNetworkAccessManager *networkAccessManager;
};
#endif // MYNETWORKOBJECT_H

(2)mynetworkobject.cpp

#include "mynetworkobject.h"
MyNetworkObject::MyNetworkObject(QObject *parent) : QObject(parent) {
    networkAccessManager = new QNetworkAccessManager(this);
    QObject::connect(networkAccessManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(finishedSlot(QNetworkReply *)));
}
void MyNetworkObject::get(QUrl url) {
    qDebug()<<"get "<<url;
    const QNetworkRequest request = QNetworkRequest(url);
    //这里可以加入chrome的请求头部,使其更接近浏览器
request.setHeader(QNetworkRequest::UserAgentHeader, QVariant("Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.76 Mobile Safari/537.36"));
    networkAccessManager->get(request);
    /*
    这边会打印错误信息,如下
    QSslSocket: cannot resolve TLSv1_1_client_method
    QSslSocket: cannot resolve TLSv1_2_client_method
    QSslSocket: cannot resolve TLSv1_1_server_method
    QSslSocket: cannot resolve TLSv1_2_server_method
    原因是
    The version of openssl you have installed is too old.
    Install version 1.0.0 or newer (preferably the latest version).
    If those methods can't be resolved (but you still have some SSL support) then Qt is only able to find an older version such as openssl 0.9.8 which is too old to support these methods.
    */
}
void MyNetworkObject::finishedSlot(QNetworkReply *reply) {
    /*
     enum Attribute {
        HttpStatusCodeAttribute,
        HttpReasonPhraseAttribute,
        RedirectionTargetAttribute,
        ConnectionEncryptedAttribute,
        CacheLoadControlAttribute,
        CacheSaveControlAttribute,
        SourceIsFromCacheAttribute,
        DoNotBufferUploadDataAttribute,
        HttpPipeliningAllowedAttribute,
        HttpPipeliningWasUsedAttribute,
        CustomVerbAttribute,
        CookieLoadControlAttribute,
        AuthenticationReuseAttribute,
        CookieSaveControlAttribute,
        MaximumDownloadBufferSizeAttribute, // internal
        DownloadBufferAttribute, // internal
        SynchronousRequestAttribute, // internal
        BackgroundRequestAttribute,
        SpdyAllowedAttribute,
        SpdyWasUsedAttribute,
        EmitAllUploadProgressSignalsAttribute,
        User = 1000,
        UserMax = 32767
    };
     */
    printAttribute(reply, QNetworkRequest::HttpStatusCodeAttribute, "HttpStatusCodeAttribute");
    printAttribute(reply, QNetworkRequest::HttpReasonPhraseAttribute, "HttpReasonPhraseAttribute");
    printAttribute(reply, QNetworkRequest::RedirectionTargetAttribute, "RedirectionTargetAttribute");
    printAttribute(reply, QNetworkRequest::ConnectionEncryptedAttribute, "ConnectionEncryptedAttribute");
    printAttribute(reply, QNetworkRequest::CacheLoadControlAttribute, "CacheLoadControlAttribute");
    printAttribute(reply, QNetworkRequest::CacheSaveControlAttribute, "CacheSaveControlAttribute");
    printAttribute(reply, QNetworkRequest::SourceIsFromCacheAttribute, "SourceIsFromCacheAttribute");
    printAttribute(reply, QNetworkRequest::DoNotBufferUploadDataAttribute, "DoNotBufferUploadDataAttribute");
    printAttribute(reply, QNetworkRequest::HttpPipeliningAllowedAttribute, "HttpPipeliningAllowedAttribute");
    printAttribute(reply, QNetworkRequest::HttpPipeliningWasUsedAttribute, "HttpPipeliningWasUsedAttribute");
    printAttribute(reply, QNetworkRequest::CustomVerbAttribute, "CustomVerbAttribute");
    printAttribute(reply, QNetworkRequest::CookieLoadControlAttribute, "CookieLoadControlAttribute");
    printAttribute(reply, QNetworkRequest::AuthenticationReuseAttribute, "AuthenticationReuseAttribute");
    printAttribute(reply, QNetworkRequest::CookieSaveControlAttribute, "CookieSaveControlAttribute");
    printAttribute(reply, QNetworkRequest::MaximumDownloadBufferSizeAttribute, "MaximumDownloadBufferSizeAttribute");
    printAttribute(reply, QNetworkRequest::DownloadBufferAttribute, "DownloadBufferAttribute");
    printAttribute(reply, QNetworkRequest::SynchronousRequestAttribute, "SynchronousRequestAttribute");
    printAttribute(reply, QNetworkRequest::BackgroundRequestAttribute, "BackgroundRequestAttribute");
    printAttribute(reply, QNetworkRequest::SpdyAllowedAttribute, "SpdyAllowedAttribute");
    printAttribute(reply, QNetworkRequest::SpdyWasUsedAttribute, "SpdyWasUsedAttribute");
    printAttribute(reply, QNetworkRequest::EmitAllUploadProgressSignalsAttribute, "EmitAllUploadProgressSignalsAttribute");
    printAttribute(reply, QNetworkRequest::User, "User");
    printAttribute(reply, QNetworkRequest::UserMax, "UserMax");
    if(reply->error() == QNetworkReply::NoError) {
        qDebug()<<"NoError";
        /*
         如果url是一个gif图地址,可以用该方法获取gif的每一帧
         imageReader有bug,即使读取gif图,jumpToNextImage也会返回false
         另外jumpToImage返回false,但确实能往后跳,注意是只能往后跳
         看了该博客的评论后才知道,原来qt根本就没有实现这些方法
         http://blog.csdn.net/liyuanbhu/article/details/46439505
         QImageReader imageReader(reply);
         int imageCount = imageReader.imageCount();
         qDebug()<<"imageReader.imageCount = "<<imageCount;
         for(int i=0;i<imageCount;i++) {
            bool jumpResult = imageReader.jumpToImage(i);
            qDebug()<<"jump to image "<<i<<" "<<(jumpResult?"succ":"fail");
            QImage image = imageReader.read();
            if(!image.isNull()) {
                qDebug()<<"imageSize = "<<image.size();
            } else {
                qDebug()<<"image is null";
            }
         }
        */
        QByteArray buffer = reply->readAll();
        //QString str = QString::fromUtf8(buffer);
        //qDebug()<<str;
    } else {
        qDebug()<<reply->errorString();
    }
    reply->deleteLater();
}
void MyNetworkObject::printAttribute(QNetworkReply *reply, QNetworkRequest::Attribute code, QString codeStr) {
    QVariant attributeVarient = reply->attribute(code);
    QString result = QString("%1 = %2").arg(codeStr).arg(attributeVarient.toString());
    qDebug()<<result;
}

3、主函数 main.cpp

#include <QCoreApplication>
#include "mynetworkobject.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyNetworkObject *networkObj = new MyNetworkObject();
    QUrl url("http://blog.csdn.net/chy555chy/article/details/51820210");
    networkObj->get(url);
    return a.exec();
}

4、运行截图


说明,没仔细看我代码的人可能没注意。运行截图上面报了个QSslSocket错误,这个原因是由于当前计算机上的SSL版本太低,安装最新版的SSL即可。

另外,该错误并不影响HTTP的GET方法获取网页数据。


chrome的浏览器的User-Agent查看方式:右键 --> 审查 --> Network选显卡





3 0
原创粉丝点击