QT中的HTTP
QT中的HTTP
HTTP Client
进⾏ Qt 开发时, 和服务器之间的通信很多时候也会⽤到 HTTP 协议.
通过 HTTP 从服务器获取数据.
通过 HTTP 向服务器提交数据.
核⼼ API
关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply
QNetworkAccessManager 提供了 HTTP 的核⼼操作.
QNetworkRequest 表⽰⼀个 HTTP 请求(不含 body).
如果需要发送⼀个带有 body 的请求(⽐如 post), 会在 QNetworkAccessManager 的 post ⽅法中通过单独的参数来传⼊ body.
其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型, 常⽤取值:
QNetworkReply 表⽰⼀个 HTTP 响应. 这个类同时也是 QIODevice 的⼦类
此外, QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触发
代码⽰例
给服务器发送⼀个 GET 请求.
- 创建界⾯. 包含⼀个 QLineEdit , QPushButton
• 先使⽤⽔平布局把 QLineEdit 和 QPushButton 放好, 并设置这两个控件的垂直⽅向的sizePolicy 为 Expanding
• 再使⽤垂直布局把 QPlainTextEdit 和上⾯的⽔平布局放好. ( QPlainTextEdit 的readOnly 设为 true )
• 设置垂直布局的 layoutStretch 为 5, 1 (当然这个尺⼨⽐例根据个⼈喜好微调).
💡 此处建议使⽤ QPlainTextEdit ⽽不是 QTextEdit . 主要因为 QTextEdit 要进⾏富⽂本解析, 如果得到的 HTTP 响应体积很⼤, 就会导致界⾯渲染缓慢甚⾄被卡住
- 修改 widget.h, 创建 QNetworkAccessManager 属性
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QNetworkAccessManager>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;QNetworkAccessManager*manager;
};
#endif // WIDGET_H
- 修改 widget.cpp, 创建实例
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("客户端");manager=new QNetworkAccessManager(this);
}
- 编写按钮的 slot 函数, 实现发送 HTTP 请求功能.
void Widget::on_pushButton_clicked()
{//1.获取到输入框中的urlQUrl url(ui->lineEdit->text());//2.构造一个HTTP请求对象QNetworkRequest request(url);//3.发送请求QNetworkReply* response=manager->get(request);//4.通过信号槽来接受响应connect(response,&QNetworkReply::finished,this,[=](){if(response->error()==QNetworkReply::NoError){QString html=response->readAll();ui->plainTextEdit->setPlainText(html);}else{ui->plainTextEdit->setPlainText(response->errorString());}//还需要对response进行释放response->deleteLater();});
}