目录
描述
进⾏ Qt 开发时, 和服务器之间的通信很多时候也会⽤到 HTTP 协议
Qt 中提供了客户端,但是并没有提供相应的服务器的库,所以这里我们只讨论 客户端
• 通过 HTTP 从服务器获取数据.
• 通过 HTTP 向服务器提交数据.
相关函数
关键类主要是三个. QNetworkAccessManager , QNetworkRequest , QNetworkReply
QNetworkAccessManager 提供了 HTTP 的核心操作.
|-----------------------------------------------------|-----------------------------------------|
| get(const QNetworkRequest& ) | 发起⼀个 HTTP GET 请求. 返回 QNetworkReply 对象. |
| post(const QNetworkRequest& , const QByteArray& ) | 发起⼀个 HTTP POST 请求. 返回 QNetworkReply 对象. |
QNetworkRequest 表⽰⼀个 HTTP 请求(不含 body).
PS:如果需要发送⼀个带有 body 的请求(⽐如 post), 会在 QNetworkAccessManager 的 post ⽅法中通过单独的参数来传⼊ body
|-------------------------------------------------------------------------|----------------------|
| QNetworkRequest(const QUrl& ) | 通过 URL 构造⼀个 HTTP 请求. |
| setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value) | 设置请求头. |
不包含 body
补充:其中的 QNetworkRequest::KnownHeaders 是⼀个枚举类型,常⽤取值如下
|---------------------|---------------------------------|
| ContentTypeHeader | 描述 body 的类型. |
| ContentLengthHeader | 描述 body 的⻓度. |
| LocationHeader | ⽤于重定向报⽂中指定重定向地址. (响应中使⽤, 请求⽤不到) |
|-----------------|---------------|
| CookieHeader | 设置 cookie |
| UserAgentHeader | 设置 User-Agent |
QNetworkReply 表⽰⼀个 HTTP 响应. 这个类同时也是 QIODevice 的⼦类.
|----------------------------------------------|------------------|
| error() | 获取出错状态. |
| errorString() | 获取出错原因的⽂本. |
| readAll() | 读取响应 body. |
| header(QNetworkRequest::KnownHeaders header) | 读取响应指定 header 的值 |
补充: QNetworkReply 还有⼀个重要的信号 finished 会在客⼾端收到完整的响应数据之后触发.
使用
网络编程一定要加上 network
准备工作
初始界面,这一点和之前的一样
我们使用 QPlainTextEdit 来显示读取到的响应
处理响应
不会阻塞,得使用 QNetworkReply 里面信号,来触发响应机制
测试
代码
代码书写和其他平台的网络编写流程是差不多的
cpp
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkReply>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("客户端");
manager = new QNetworkAccessManager(this);
}
Widget::~Widget()
{
delete ui;
}
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();
});
}