`

[原创]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

相关推荐

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

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

    基于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等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    ftp.zip FTP网络通讯

    本文是用c++在QT平台编写的一个FTP网络通信部分,属于原创类文件,未经允许不得转载。

    通信电源蓄电池组容量性充放电试验三措一案.docx

    5G通信行业、网络优化、通信工程建设资料。

    铁塔维护检测手段.docx

    5G通信行业、网络优化、通信工程建设资料

    通信设备安装施工组织方案.doc

    5G通信、网络优化与通信建设

    299-教育行业信息化与数据平台建设分享.pptx

    299-教育行业信息化与数据平台建设分享.pptx

    手写数字和字母数据集binaryalphadigs.mat

    手写数字和字母数据集binaryalphadigs.mat

    变电站视频监控解决方案.doc

    5G通信行业、网络优化、通信工程建设资料

    PEMFC电堆输出电压模型,可计算效率、输出功率、电流、消耗功率以及等效内阻

    PEMFC电堆输出电压模型,可计算效率、输出功率、电流、消耗功率以及等效内阻

    创建型 结构型 设计型设计模式相关知识

    1、 设计思路 1、 创建型设计模式 创建型设计模式主要“关注对象的创建”。 1. 单例模式 单例模式:能不用就不用 ,他的目的就是为了让一个类只创建一个实例。 用法:把对象的创建权限关闭,提供一个人公开的静态方法,实现静态方法后将实例存放于静态的字段中,方法中返回。 单例模式会长期持有一个对象不会被释放,而普通实例不用就会被释放(当然必须是GC之后才会被释放)。 单例用途;数据临时存储的地方如静态字典,数据库连接池、线程池、IOC容器实例。   1.1懒汉式 设置构造函数为私有的,避免其他外部类可以对其实例化, 创建静态类来存储实例。 在静态方法中创建实例,避免多个线程同时调用方法,我们可以加线程锁, 在方法中使用双判断语句:最外层判断是为了提高运行速率,检查如果静态字段中已经存在实例了就可以直接return;第二层判断是避免创建多个对象实例。 1.2饿汉式1 静态构造函数:由CLR保证,静态构造函数只会在启动程序时候,由CLR自行创建。并且只会创建一次,相比较于懒汉式创建的更早,并且不需要担心会

    《通信工程概预算》模拟试题2.docx

    5G通信行业、网络优化、通信工程建设资料

    毕业设计:Java项目之jsp高校规章制度管理系统(源码 + 数据库 + 说明文档)

    论文目录: 第二章 需求分析与系统总体设计 - 5 - 2.1java的特点 - 5 - 2.2技术可行性 - 5 - 2.3可靠性和安全性特点 - 6 - 2.4系统总体设计 - 6 - 2.5JSP技术介绍 - 7 - 2.5.1 什么是JSP - 7 - 2.5.2 JSP技术特点 - 7 - 2.5.3 JSP开发WEB的几种方式 - 8 - 第三章 数据库的设计与实现 - 9 - 3.1数据库的需求分析 - 9 - 3.2数据库的逻辑设计 - 10 - 3.3 数据库的结构创建 - 10 - 第四章 后台系统和数据库的配置 - 13 - 4.1后台服务器配置 - 13 - 4.2后台数据库的配置 - 13 - 4.3后台全局配置文件 - 13 - 第五章 前端网络页面的开发与设计 - 14 - 5.1登录页面 - 14 - 5.2 管理员用户页面 - 15 - 5.3 注册用户页面 - 16 - 5.4主页面 - 17 - 5.5用户注册页面 - 18 - 5.6 规章制度管理页面 - 18 - 第六章 系统的安全性 - 19 - 6.1 session和cookie的安

    ONU、分光器验收规范.doc

    5G通信行业、网络优化、通信工程建设资料。

    99-煤矿安全生产标准化基本要求及评分方法.pdf

    99-煤矿安全生产标准化基本要求及评分方法.pdf

    node-v12.22.6-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    475现场通讯器用户手册

    475现场通讯器用户手册

    node-v7.7.0.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    600A钳形电流表使用手册

    600A钳形电流表使用手册

Global site tag (gtag.js) - Google Analytics