`

[原创]QT HTTP 通讯 使用方法

阅读更多
//////////////grabthread.h////////////////////
#ifndef GRABTHREAD_H
#define GRABTHREAD_H

#include <QThread>
class QNetworkAccessManager;
#include <QNetworkReply>

class GrabThread : public QThread
{
    Q_OBJECT
public:
    explicit GrabThread(QObject *parent = 0);
    void run();
    void saveToFile(QString&);

    bool runrun;

signals:

public slots:
    void slot_httpFinished();
    void slot_httpError(QNetworkReply::NetworkError);

private:
    QNetworkAccessManager* qnam;
    QNetworkReply* reply;
    QString query_word;
    bool is_init;
};

#endif // GRABTHREAD_H



//////////////grabthread.cpp////////////////////
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
#include <QEventLoop>

GrabThread::GrabThread(QObject *parent) :
    QThread(parent),
    is_init(true)
{
}

void GrabThread::run()
{
    if (is_init)
    {
        qnam = new QNetworkAccessManager();
        is_init = false;
    }
    while(runrun)
    {
        startQuery("");
    }
}

void GrabThread::startQuery(QString redirect_url)
{
    QNetworkRequest request;
    QString url;
    // 如果是重定向请求, 则直接指向位置, 否则拼字符串
    if (redirect_url.length() != 0)
    {
        url = redirect_url;
    }else
    {
        url = "http://www.nuihq.com/" + query_word;
    }
    // 设定url
    request.setUrl(QUrl(url));
    // 设定请求头
    request.setRawHeader("Host", "www.nuihq.com");
    request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "zh-cn,zh;q=0.5");
    // TODO:使用gzip
    request.setRawHeader("Accept-Encoding", "deflate");
    request.setRawHeader("Accept-Charset", "utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Connection", "keep-alive");

    // 使用get方式发起请求
    reply = qnam->get(request);
    
/***************如果需要同步********************/
    qRegisterMetaType<QNetworkReply::NetworkError>
("QNetworkReply::NetworkError");
    QEventLoop loop; // 使用事件循环使得网络通讯同步进行
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,
            SLOT(slot_httpError(QNetworkReply::NetworkError)));
    loop.exec(); // 进入事件循环, 直到reply的finished()信号发出, 这个语句才能
                        //退出
    slot_httpFinished();
/**************************************/
/****************如果需要异步**********************/
    connect(reply, SIGNAL(finished()), this, SLOT(slot_httpFinished()));
    qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
    connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this,
            SLOT(slot_httpError(QNetworkReply::NetworkError)));
/**************************************/
}

void GrabThread::slot_httpFinished()
{
    int http_status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();

    reply->close();
    reply->deleteLater();

    // 判断是否是重定向
    if (http_status == 302)
    {
        startQuery(reply->rawHeader("Location"));
    }else
    {
        QString reply_content = QString::fromUtf8(reply->readAll());
        if (reply->error() == QNetworkReply::NoError)
        {
            saveToFile(reply_content);
        }else
        {
            qDebug() << "ERROR:" << query_word << " CODE:" << reply->error();
        }
    }
}

void GrabThread::slot_httpError(QNetworkReply::NetworkError)
{

}

void GrabThread::saveToFile(QString & html_content)
{
    QFile file("html/" + query_word + ".html");
    file.open(QIODevice::WriteOnly);
    file.write(file_content.toUtf8());
    file.close();
}

1
2
分享到:
评论
1 楼 0x14 2012-02-17  
你添加了 "Accept-Encoding", "deflate"

但是没有解包deflate

相关推荐

    Qt教程及软件

    ### Qt教程及软件知识点概述 ...这些内容不仅覆盖了Qt的基础使用方法,还涉及到了一些高级主题,如2D绘图、数据库操作、网络编程等。通过学习这些教程,初学者可以迅速上手Qt开发,并逐步成长为熟练的Qt开发者。

    基于Qt实现局域网聊天室(毕设)

    0.本项目是本人毕业设计项目,原创,拒绝抄袭,可以学习参考! 项目使用遇到问题私聊我 1. 可以进行私聊和传输文件功能 2. 管理员可以进行权限管理 3. 数据库使用Mysql数据库,使用本项目,需要提前在服务器或者本地...

    QT4.6实践编写串口调试助手(原创全源码)

    QT4.6实践编写串口调试助手(原创全源码), 包括使用qextserial,包括可在linux和windows两种环境下识别通讯方式,和硬件接口识别。非常适合初学者学习,建议下载QT_Create最新版本

    原创 PC与单片机双向通讯智能温控程序

    本项目"原创 PC与单片机双向通讯智能温控程序"涉及了多个重要知识点,包括单片机编程、串行通信、智能控制以及温度监测。以下是对这些知识点的详细阐述: 1. **单片机编程**:单片机是一种微控制器,它集成了CPU、...

    基于C语言实现本站原创 PC与单片机双向通讯智能温控程序(含源代码+使用说明).zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    本站原创 PC与单片机双向通讯智能温控程序_单片机C语言实例(纯C语言源代码).zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    一个类似QQ的软件源码

    可能使用的技术有GUI框架(如Qt、Android UI、iOS UIKit)和布局管理。 6. **消息推送与通知**:当收到新消息时,软件需要及时提醒用户。这可能涉及到服务器端的消息队列、推送服务(如GCM/FCM、APNS)以及客户端的...

    大灰狼远控DOOS版V5.52源码

    1. **网络通信协议**:大灰狼远控可能使用TCP/IP协议进行数据传输,也可能采用HTTP/HTTPS等协议以隐藏通讯行为。理解这些协议的工作方式对于优化通信效率和安全性至关重要。 2. **加密技术**:为了保护数据安全,...

Global site tag (gtag.js) - Google Analytics