Qt 网络编程1 http get

Qt中的Qt Network模块用来编写基于TCP/IP的网络程序。

低层次的:QTcpSocket、QTcpServer、QUdpSocket等。

高层次的:QNetworkRequest、QNetworkReply和QNetworkAccessManager

负载管理:QNetworkConfiguration、QNetworkConfigurationManager和QNetworkSession

使用方法:在pro文件中添加如下一行:

QT       += network

1. 网络访问接口

QNetworkRequest:网络请求,创建请求对象时指定的URL决定了请求使用的协议,目前支持HTTP、FTP和本地文件URL的上传和下载。

QNetworkAccessManager:协调网络操作,可以调度创建好的请求,并发射信号来报告进度。该类还可以协调cookies的使用、身份验证请求和代理的使用等。

QNetworkReply:网络请求应答,他会在请求调度完成时由QNetworkAccessManager创建。QNetworkReply提供的信号可以用来单独监视每一个应答,也可以使用QNetworkAccessManager的信号来实现,这样就可以丢弃应答对象的引用。因为QNetworkReply是QIODevice的子类,应答可以使用同步或异步的方式来处理,比如作为阻塞或者非阻塞操作。

1.1 HTTP

HyperText Transfer Protocol 超文本传输协议。是一个客户端和服务端之间进行请求和应答的标准。通常由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP连接,服务器端就会向客户端发回一个应答。下面先来看一个通过网络访问接口实现HTTP通信的例子:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class QNetworkReply;
class QNetworkAccessManager;

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QNetworkAccessManager *manager;

private slots:
    void replyFinished(QNetworkReply *);

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtNetwork>
#include <QFile>
#include <QCoreApplication>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    manager = new QNetworkAccessManager(this);
    connect(manager,&QNetworkAccessManager::finished,this,&MainWindow::replyFinished);
    manager->get(QNetworkRequest(QUrl("http://www.baidu.com/")));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::replyFinished(QNetworkReply *reply)
{
    QString all = reply->readAll();
    ui->textBrowser->setText(all);
    QString fileName = QCoreApplication::applicationDirPath() + "/output.txt";
    QFile file(fileName);
    if (file.open(QIODevice::ReadWrite)) {
        file.write(all.toLatin1());
    }
    file.close();
    reply->deleteLater();
}

这里先创建了一个QNetworkAccessManager类的实例,它用来发送网络请求和接收应答。然后关联了finished()信号和自定义的槽,每当网络应答结束时都会发射这个信号。最后使用了get()函数来发送一个网络请求,网络请求使用QNetworkRequest类表示,get()函数返回一个QNetworkReply对象。除了get()函数,管理器还提供了发送HTTP POST请求的post()函数、HTTP PUT请求的put函数以及HTTP DELETE请求的deleteResource()函数。

因为QNetworkReply继承自QIODevice类,所以可以像操作一般的I/O设备一样来操作该类。这里使用了readAll()函数来读取所有的数据应答,完成数据的读取后需要使用deleteLater()来删除reply对象。

发布了257 篇原创文章 · 获赞 22 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_24127015/article/details/104651905