zoukankan      html  css  js  c++  java
  • Qt Demo Http 解析网址 Openssl

    今天练习了一下Qt 解析http协议,在Demo中使用到了Openssl

    一上午的时间都是编译openssl,不过还是没有成功,很遗憾,这里整理了有关这个Demo的本件

    网盘连接:见下方评论吧,长传太慢了

    不过虽然没有编译通过openssl。不过也不影响使用,可以直接下载现成的openssl库进行开发,只需要安装,并且把文件拷贝值Qt目录的bin文件夹下面即可

    下载地址:http://slproweb.com/products/Win32OpenSSL.html

    剩下的就是按照网上的教程,一步一步的来编写代码

    软件截图

    详细代码

    这里需要在工程文件中加入网络模块

    pro工程文件

    #-------------------------------------------------
    #
    # Project created by QtCreator 2016-12-27T09:16:58
    #
    #-------------------------------------------------
    
    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets network
    
    TARGET = http_Project
    TEMPLATE = app
    
    
    SOURCES += main.cpp
            widget.cpp
    
    HEADERS  += widget.h
    
    FORMS    += widget.ui
    
    RC_FILE = ./source/Logo/http_icon.rc
    


    头文件

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QtNetwork/QNetworkAccessManager>
    #include <QtNetwork/QNetworkReply>
    #include <QtNetwork/QNetworkRequest>
    #include <QTimer>
    #include <QString>
    #include <QByteArray>
    #include <QTextCodec>
    #include <QMessageBox>
    #include <QUrl>
    
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
        bool sendRequest(const QString& strUrl);
    
    private slots:
        void slot_requestFinished();
        void slot_requestTimeout();
        void on_pushButton_clicked();
    
    signals:
        void signal_requestFinished(bool bSuccess,const QString& strResult);
    private:
        Ui::Widget *ui;
    
        QString m_serUrl;
        QNetworkAccessManager* m_pNetworkManager;
        QNetworkReply* m_pNetworkReply;
        QTimer* m_pTimer;
    };
    
    #endif // WIDGET_H
    


    cpp文件

    #include "widget.h"
    #include "ui_widget.h"
    #include <QDebug>
    const int nHTTP_TIME = 10000;
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        setWindowTitle("Http Demo");            //set window title
        ui->lineEdit_address->setToolTip("please input the address");
        ui->lineEdit_address->setPlaceholderText("please input the address");
        m_pNetworkManager = new QNetworkAccessManager(this);
        m_pNetworkReply = NULL;
        m_pTimer = new QTimer;
        connect(m_pTimer,SIGNAL(timeout()),this,SLOT(slot_requestTimeout()));
    }
    
    Widget::~Widget()
    {
        m_pTimer->stop();
        delete ui;
    }
    
    bool Widget::sendRequest(const QString &strUrl)
    {
        m_serUrl = strUrl;
        QNetworkRequest netRequest;
        netRequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-from-urlencoded");
        netRequest.setUrl(QUrl(strUrl));
        if(strUrl.toLower().startsWith("https"))
        {
            QSslConfiguration sslConfig;
            sslConfig.setPeerVerifyMode(QSslSocket::VerifyNone);
            sslConfig.setProtocol(QSsl::TlsV1_1);
            netRequest.setSslConfiguration(sslConfig);
        }
        m_pNetworkReply = m_pNetworkManager->get(netRequest);
        connect(m_pNetworkReply,SIGNAL(finished()),this,SLOT(slot_requestFinished()));
        m_pTimer->start(nHTTP_TIME);
    
        qDebug()<<"sendRequest";
    
        return true;
    }
    
    void Widget::slot_requestFinished()
    {
        m_pTimer->stop();
        QByteArray resultContent = m_pNetworkReply->readAll();
        QTextCodec* pCodec = QTextCodec::codecForName("UTF-8");
        QString strResult = pCodec->toUnicode(resultContent);
        int nHttpCode = m_pNetworkReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
        qDebug()<<"mHttpCode"<<nHttpCode;
        if(nHttpCode == 200)
        {
            ui->textEdit_result->setText(strResult);
            emit signal_requestFinished(true,strResult);
        }
        else
        {
            emit signal_requestFinished(false,strResult);
        }
        m_pNetworkReply->deleteLater();
    //    this->deleteLater();
        qDebug()<<"requestFinish";
    }
    
    void Widget::slot_requestTimeout()
    {
        emit signal_requestFinished(false ,"timeout");
        QMessageBox::warning(this,"Waring","Request False");
        m_pNetworkReply->deleteLater();
    //    this->deleteLater();
    }
    
    void Widget::on_pushButton_clicked()
    {
        QString str = ui->lineEdit_address->text().trimmed();
        sendRequest(str);
    }
    



  • 相关阅读:
    callAfter 例子2
    wxpython
    python 处理excel 进程无法退出的问题
    常用电子技术网
    Emeditor 与正则表达式
    Windows程序中的字符编码
    Delphi7 无法启动 问题搞定
    2007中国发烧盘点之作《天路》发烧女声版
    一台电脑安装多个(虚拟)网卡问题
    无法删除xxx文档/文件夹:找不到指定的路径。请确定指定的路径是否正确
  • 原文地址:https://www.cnblogs.com/DreamDog/p/9160065.html
Copyright © 2011-2022 走看看