моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Http — это аббревиатура протокола передачи гипертекста, который определяет характеристики связи между браузерами и веб-серверами. Это простой протокол запроса-ответа, который обычно работает поверх TCP.
Функция: он определяет спецификации передачи информации между WWW-сервером и браузером и представляет собой соглашение, которое соблюдают обе стороны.
2.Как работает http: HTTP основан на модели клиент/сервер и ориентирован на соединение. Процесс обработки HTTP-транзакций
1. Используйте классы QNetworkAccessManager и QNetworkReply:
2. Используйте классы QHttpEngine и QHttpNetworkRequest/Reply (нижний уровень):
Вообще говоря, для простых операций HTTP достаточно использования высокоуровневого интерфейса QNetworkAccessManager. Он удобно справляется с общими потребностями.
Если вам нужен контроль более низкого уровня, например настройка механизма HTTP или деталей запроса/ответа, вы можете использовать классы низкого уровня, такие как QHttpEngine.
Короче говоря, Qt предоставляет полную реализацию HTTP-клиента, и разработчики могут выбрать более подходящий интерфейс для операций сетевого взаимодействия в зависимости от реальных потребностей. Это обеспечивает хорошую поддержку разработки приложений Qt.
Первый тип: менеджер сетевых подключений QNetworkAccessManager, 2 действия: получить/отправить для получения или отправки запроса, а возвращаемый объект QNetworkReply содержит различную информацию о соединении.
Второй тип: QHttpEngine только управляет запросами на подключение и не несет ответственности за их отправку.
Используйте QHttpNetworkRequest для создания запроса и отправки его через QHttpEngine.
Проанализируйте возвращенный QHttpNetworkReply, чтобы получить ответ.
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
-
- #include <QMainWindow>
-
-
- #include <QtNetwork> // 提供编程TCP/IP客户端和服务器的类
- #include <QUrl> // 提供接口使用URLs
-
-
- QT_BEGIN_NAMESPACE
- namespace Ui { class MainWindow; }
- QT_END_NAMESPACE
-
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
-
- public:
- MainWindow(QWidget *parent = nullptr);
- ~MainWindow();
-
-
- private slots:
- void on_pushButton_clicked();
-
- private:
- Ui::MainWindow *ui;
- QNetworkAccessManager* accesssMgr;
- };
- #endif // MAINWINDOW_H
-
-
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
-
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- accesssMgr =new QNetworkAccessManager(this);
-
- QObject::connect(accesssMgr,QOverload<QNetworkReply*>::of(&QNetworkAccessManager::finished),this,
- [this](QNetworkReply* reply){
- QString read=reply->readAll();
- ui->textBrowser->setText(read);
- reply->deleteLater(); //释放
- });
-
- }
-
- MainWindow::~MainWindow()
- {
- delete ui;
- }
-
-
- void MainWindow::on_pushButton_clicked()
- {
- ui->label->setText("数据正在下载中,请耐心等待......");
- QString url=ui->textEdit->toPlainText();
- qDebug()<<url;
- accesssMgr->get(QNetworkRequest(QUrl(url)));
- }
- #include "httpserver.h"
-
- HttpServer::HttpServer(QObject *parent) : QObject(parent)
- {
- server =new QTcpServer(this);
- //连接回调
- connect(server,&QTcpServer::newConnection,this,&HttpServer::MyselfNewConnectCalllSlot);
- //开始监听
- if(!server->listen(QHostAddress::Any,8088))
- {
- qDebug()<<"n致命错误:Web服务器没有启动,请重新检查!"<<endl;
- }
- else
- {
- qDebug()<<"n正常启动:Web服务器端口:8088,等待客户端连接......"<<endl;;
- }
- }
- void HttpServer::MyselfNewConnectCalllSlot(){
- socket = server->nextPendingConnection(); //获取连接
- while(!(socket->waitForReadyRead(100))); //等待套接字是否有可读数据。 一直阻塞线程等待,直到有可读数据到达套接字,或者超时返回。
-
- QString webdata;
- webdata.resize(1000);
- webdata=socket->read(1000);
-
- qDebug()<<"正常运行:从浏览器读取数据信息......"<<webdata;
-
- //封装http协议
- socket->write("HTTP/1.1 200 OKrn");
- socket->write("Content-Type: text/htmlrn");
- socket->write("Connection: closern");
- socket->write("Refresh: 3rnrn"); // 每秒刷新Web浏览器
- socket->write("<!DOCTYPE>"
- "<html>"
- "<header>"
- "<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>"
- "<title>HttpServer</title>"
- "</header>"
- "<body>客户端已经连接HttpSever服务器秒数为:");
-
- QByteArray byte;
- static qint16 icount=0;
- byte.setNum(icount++);
- socket->write(byte);
- socket->write("</html>");
- /*
- flush() 不会等待数据真正发送出去,只是把数据从本地缓冲区 flush 到内核缓冲区。
- 如果输出缓冲区没有数据,flush() 有可能不做任何操作。
- 调用 flush() 可以确保目前为止写到 socket 的所有数据都发送给对端,而不是 buffered 在本地。
- 一般在发送完请求或应答后调用,保证数据及时发送出去。
- */
- socket->flush(); //刷新 socket 对象的输出缓冲区。 并发送
-
-
- connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
- socket->disconnectFromHost();
- }
http — это протокол прикладного уровня, основанный на TCP, поэтому будут использоваться классы TCP, а инкапсуляция протокола фиксирована.Дизайн основной функции-члена
- 请求:
- GET /index.html HTTP/1.1
- Host: www.example.com
- User-Agent: Mozilla/5.0...
- Accept: text/html
-
- 响应:
- HTTP/1.1 200 OK
- Date: Mon, 27 Jan 2020 08:12:31 GMT
- Server: Apache/2.4.1 (Unix)
- Last-Modified: Wed, 22 Jul 2020 19:15:56 GMT
- ETag: "49092-5b6-52c65aa32f280"
- Accept-Ranges: bytes
- Content-Length: 438
- Connection: close
- Content-Type: text/html; charset=UTF-8
-
- <html>
- <head>
- <title>Welcome to example.com!</title>
- </head>
- <body>
- <h1>Hello World!</h1>
- <p>This is the hello world page for an example website.</p>
- </body>
- </html>
-
-
- 这个示例演示了一个简单的HTTP请求和响应过程:
- 客户端发送GET请求获取index.html页面
- 服务器返回200状态码,表示请求成功
- 返回各种报头如日期、服务器信息等
- 返回HTML页面内容作为响应体
Основными классами для программирования Qt HTTP являются QNetworkAccessManager, QNetworkRequest и QNetworkReply.
QNetworkAccessManager:
Управляйте подключениями и запросами к сети. Отправка и получение данных.
Предоставляет расширенные функции, такие как get(), post() и put(), для инициации HTTP-запросов.
Сигналы:finished(), authenticateRequired().
QNetworkRequest:
Представляет HTTP-запрос. Содержит такие атрибуты, как URL-адрес, заголовки и т. д.
Установите метод запроса, тип контента, информацию заголовка и т. д.
QNetworkОтвет:
Представляет ответ HTTP. Возвращаемый код состояния и содержимое.
Сигналы: downloadProgress(), error() и т.д. уведомляют о результатах обработки.
Функциональные функции, такие как readAll(), читают содержимое ответа.
Основные шаги:
Создайте экземпляр объекта QNetworkAccessManager.
Создайте объект QNetworkRequest, чтобы установить URL-адрес и свойства.
Вызовите такие функции, как QNetworkAccessManager::get() или post(), чтобы сделать запрос.
Прослушайте сигналы QNetworkReply, чтобы получить результаты.
Прочитайте содержимое через QNetworkReply или обработайте ошибки.
Удалите QNetworkReply и запросите объекты, чтобы предотвратить утечку памяти.