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_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
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.获取到输入框中的url
QUrl 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();
});
}