2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Http est l'abréviation de Hypertext Transfer Protocol, qui définit les spécifications de communication entre les navigateurs et les serveurs Web. Il s'agit d'un simple protocole de requête-réponse qui s'exécute généralement sur TCP.
Fonction : Il stipule les spécifications de transfert d'informations entre le serveur WWW et le navigateur et constitue un accord que les deux parties respectent.
2.Comment fonctionne http : HTTP est basé sur le modèle client/serveur et est orienté connexion. Processus de transaction HTTP
1. Utilisez les classes QNetworkAccessManager et QNetworkReply :
2. Utilisez les classes QHttpEngine et QHttpNetworkRequest/Reply (niveau inférieur) :
De manière générale, pour des opérations HTTP simples, l'utilisation de l'interface QNetworkAccessManager de haut niveau est suffisante. Il répond facilement aux besoins courants.
Si vous avez besoin d'un contrôle de niveau inférieur, tel que la personnalisation du moteur HTTP ou des détails des requêtes/réponses, vous pouvez utiliser des classes de bas niveau telles que QHttpEngine.
En bref, Qt fournit une implémentation client HTTP complète et les développeurs peuvent choisir une interface plus appropriée pour les opérations de communication réseau en fonction des besoins réels. Cela fournit un bon support pour le développement d'applications Qt.
Le premier type : gestionnaire de connexion réseau QNetworkAccessManager, 2 actions : get/post pour obtenir ou soumettre une requête, et retourner l'objet QNetworkReply qui contient diverses informations de connexion.
Le deuxième type : QHttpEngine gère uniquement les demandes de connexion et n'est pas responsable de leur envoi.
Utilisez QHttpNetworkRequest pour créer la requête et l'envoyer via QHttpEngine.
Analysez le QHttpNetworkReply renvoyé pour obtenir la réponse.
- #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 est un protocole de couche application basé sur TCP, donc les classes TCP seront utilisées et l'encapsulation du protocole est corrigée.Conception de la fonction du membre principal
- 请求:
- 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页面内容作为响应体
Les principales classes pour la programmation HTTP Qt sont QNetworkAccessManager, QNetworkRequest et QNetworkReply.
Gestionnaire d'accès réseau QNetwork :
Gérer les connexions et les demandes au réseau. Envoyez et recevez des données.
Fournit des fonctions avancées telles que get(), post() et put() pour lancer des requêtes HTTP.
Signaux : ended(), authenticationRequired()
Demande de réseau Q :
Représente une requête HTTP. Contient des attributs tels que l'URL, les en-têtes, etc.
Définissez la méthode de demande, le type de contenu, les informations d'en-tête, etc.
Réponse de QNetwork :
Représente une réponse HTTP. Renvoie le code d’état et le contenu.
Signaux : downloadProgress(), error(), etc. notifient les résultats du traitement.
Les fonctions fonctionnelles telles que readAll() lisent le contenu de la réponse.
Principales étapes :
Créez une instance d'objet QNetworkAccessManager.
Créez un objet QNetworkRequest pour définir l'URL et les propriétés.
Appelez des fonctions telles que QNetworkAccessManager::get() ou post() pour faire une requête.
Écoutez les signaux de QNetworkReply pour obtenir les résultats.
Lisez le contenu via QNetworkReply ou gérez les erreurs.
Supprimez QNetworkReply et demandez des objets pour éviter les fuites de mémoire.