informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
1. Http adalah singkatan dari Hypertext Transfer Protocol, yang mendefinisikan spesifikasi komunikasi antara browser dan server web. Ini adalah protokol permintaan-respons sederhana yang biasanya berjalan di atas TCP.
Fungsi: Menetapkan spesifikasi transfer informasi antara server WWW dan browser, dan merupakan perjanjian yang dipatuhi oleh kedua belah pihak.
2.Cara kerja http: HTTP didasarkan pada model klien/server dan berorientasi koneksi. Proses transaksi HTTP
1. Gunakan kelas QNetworkAccessManager dan QNetworkReply:
2. Gunakan kelas QHttpEngine dan QHttpNetworkRequest/Reply (tingkat lebih rendah):
Secara umum, untuk operasi HTTP sederhana, menggunakan antarmuka QNetworkAccessManager tingkat tinggi sudah cukup. Ini menangani kebutuhan umum dengan nyaman.
Jika Anda memerlukan kontrol tingkat rendah, seperti menyesuaikan mesin HTTP atau detail permintaan/respons, Anda dapat menggunakan kelas tingkat rendah seperti QHttpEngine.
Singkatnya, Qt menyediakan implementasi klien HTTP yang lengkap, dan pengembang dapat memilih antarmuka yang lebih tepat untuk operasi komunikasi jaringan berdasarkan kebutuhan sebenarnya. Ini memberikan dukungan yang baik untuk mengembangkan aplikasi Qt.
Jenis pertama: Manajer koneksi jaringan QNetworkAccessManager, 2 tindakan: dapatkan/posting untuk mendapatkan atau mengirimkan permintaan, dan mengembalikan objek QNetworkReply yang berisi berbagai informasi koneksi.
Tipe kedua: QHttpEngine hanya mengelola permintaan koneksi dan tidak bertanggung jawab mengirimkannya.
Gunakan QHttpNetworkRequest untuk membuat permintaan dan mengirimkannya melalui QHttpEngine.
Parsing QHttpNetworkReply yang dikembalikan untuk mendapatkan respons.
- #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 adalah protokol lapisan aplikasi berdasarkan tcp, sehingga kelas tcp akan digunakan, dan enkapsulasi protokol diperbaiki.Desain fungsi anggota utama
- 请求:
- 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页面内容作为响应体
Kelas utama untuk pemrograman Qt HTTP adalah QNetworkAccessManager, QNetworkRequest dan QNetworkReply.
Manajer Akses Jaringan QNetwork:
Kelola koneksi dan permintaan ke jaringan. Mengirim dan menerima data.
Menyediakan fungsi lanjutan seperti get(), post(), dan put() untuk memulai permintaan HTTP.
Sinyal: finished(), dan authenticationRequired().
Permintaan Jaringan Q:
Mewakili permintaan HTTP. Berisi atribut seperti URL dan header.
Atur metode permintaan, tipe konten, informasi header, dll.
Balasan QNetwork:
Mewakili respons HTTP. Kembalikan kode status dan konten.
Sinyal: downloadProgress(), error(), dll. memberitahukan hasil pemrosesan.
Fungsi fungsional seperti readAll() membaca konten respons.
Langkah-langkah utama:
Buat instans objek QNetworkAccessManager.
Buat objek QNetworkRequest untuk mengatur URL dan properti.
Panggil fungsi seperti QNetworkAccessManager::get() atau post() untuk membuat permintaan.
Dengarkan sinyal QNetworkReply untuk mendapatkan hasilnya.
Membaca konten melalui QNetworkReply, atau menangani kesalahan.
Hapus QNetworkReply dan minta objek untuk mencegah kebocoran memori.