C++?Qt開發(fā)之使用QNetworkAccessManager實(shí)現(xiàn)Web網(wǎng)頁訪問
Qt 是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹如何運(yùn)用QNetworkAccessManager
組件實(shí)現(xiàn)Web網(wǎng)頁訪問。
QNetworkAccessManager是Qt網(wǎng)絡(luò)模塊中的關(guān)鍵類,用于管理網(wǎng)絡(luò)訪問和請(qǐng)求。作為一個(gè)網(wǎng)絡(luò)請(qǐng)求的調(diào)度中心,它為Qt應(yīng)用程序提供了發(fā)送和接收各種類型的網(wǎng)絡(luò)請(qǐng)求的能力,包括常見的GET、POST、PUT、DELETE等。這個(gè)模塊的核心功能在于通過處理QNetworkReply
和QNetworkRequest
來實(shí)現(xiàn)與網(wǎng)絡(luò)資源的交互。
通過QNetworkAccessManager
,Qt應(yīng)用程序能夠輕松地與遠(yuǎn)程服務(wù)器通信,獲取數(shù)據(jù)或?qū)?shù)據(jù)上傳到服務(wù)器。這種網(wǎng)絡(luò)請(qǐng)求的管理不僅是異步的,以確保不會(huì)阻塞主線程,還提供了豐富的信號(hào)和槽機(jī)制,使得開發(fā)者可以靈活地處理不同階段的網(wǎng)絡(luò)操作。
通常,QNetworkAccessManager
會(huì)與QNetworkReply
和QNetworkRequest
一起使用。QNetworkRequest
用于封裝和配置網(wǎng)絡(luò)請(qǐng)求的各種屬性,例如URL、請(qǐng)求頭等。而QNetworkReply
則代表了對(duì)網(wǎng)絡(luò)請(qǐng)求的響應(yīng),包含了請(qǐng)求返回的數(shù)據(jù)和相關(guān)信息。這三者共同協(xié)作,為Qt應(yīng)用程序提供了便捷、靈活且強(qiáng)大的網(wǎng)絡(luò)通信能力。
1.通用API函數(shù)
1.1QNetworkAccessManager
要想實(shí)現(xiàn)網(wǎng)絡(luò)通信首先需要新建一個(gè)網(wǎng)絡(luò)訪問管理器,以下是QNetworkAccessManager
類中的一些常用函數(shù)及其描述:
函數(shù) | 描述 |
---|---|
QNetworkAccessManager(QObject *parent = nullptr) | 構(gòu)造函數(shù),創(chuàng)建一個(gè)QNetworkAccessManager實(shí)例。 |
virtual ~QNetworkAccessManager() | 虛析構(gòu)函數(shù),釋放QNetworkAccessManager實(shí)例。 |
QNetworkReply *get(const QNetworkRequest &request) | 發(fā)送GET請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *post(const QNetworkRequest &request, QIODevice *data) | 發(fā)送POST請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *post(const QNetworkRequest &request, const QByteArray &data) | 發(fā)送POST請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *put(const QNetworkRequest &request, QIODevice *data) | 發(fā)送PUT請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *put(const QNetworkRequest &request, const QByteArray &data) | 發(fā)送PUT請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *deleteResource(const QNetworkRequest &request) | 發(fā)送DELETE請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *head(const QNetworkRequest &request) | 發(fā)送HEAD請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data = nullptr) | 發(fā)送自定義請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
QNetworkReply *sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, const QByteArray &data) | 發(fā)送自定義請(qǐng)求,并返回與請(qǐng)求關(guān)聯(lián)的QNetworkReply對(duì)象。 |
void setConfiguration(const QNetworkConfiguration &config) | 設(shè)置網(wǎng)絡(luò)配置,用于定制網(wǎng)絡(luò)行為。 |
QNetworkConfiguration configuration() const | 獲取當(dāng)前網(wǎng)絡(luò)配置。 |
void clearAccessCache() | 清除網(wǎng)絡(luò)訪問緩存。 |
void setCache(QAbstractNetworkCache *cache) | 設(shè)置網(wǎng)絡(luò)緩存。 |
QAbstractNetworkCache *cache() const | 獲取當(dāng)前網(wǎng)絡(luò)緩存。 |
void setCookieJar(QNetworkCookieJar *cookieJar) | 設(shè)置用于管理HTTP cookie的QNetworkCookieJar。 |
QNetworkCookieJar *cookieJar() const | 獲取當(dāng)前的HTTP cookie管理器。 |
這些函數(shù)提供了QNetworkAccessManager
的核心功能,使得開發(fā)者能夠方便地進(jìn)行各種類型的網(wǎng)絡(luò)請(qǐng)求,配置網(wǎng)絡(luò)參數(shù),并進(jìn)行相關(guān)的網(wǎng)絡(luò)管理操作。
1.2QNetworkReply
以下是QNetworkReply
類中的一些常用函數(shù)及其描述:
函數(shù) | 描述 |
---|---|
QByteArray readAll() const | 讀取所有可用的數(shù)據(jù),并返回一個(gè)QByteArray,包含從網(wǎng)絡(luò)回復(fù)讀取的所有內(nèi)容。 |
QByteArray peek(int maxSize) const | 查看最多maxSize字節(jié)的可用數(shù)據(jù),但不從緩沖區(qū)中移除。 |
QByteArray read(int maxSize) | 從網(wǎng)絡(luò)回復(fù)中讀取最多maxSize字節(jié)的數(shù)據(jù),并將其從緩沖區(qū)中移除。 |
QByteArray readLine(int maxSize = 0) | 從網(wǎng)絡(luò)回復(fù)中讀取一行數(shù)據(jù),最多包含maxSize字節(jié),并將其從緩沖區(qū)中移除。 |
void ignoreSslErrors(const QList<QSslError> &errors = QList<QSslError>()) | 忽略SSL錯(cuò)誤,繼續(xù)處理網(wǎng)絡(luò)回復(fù)。 |
void abort() | 終止網(wǎng)絡(luò)回復(fù)的處理,關(guān)閉底層連接。 |
void close() | 關(guān)閉網(wǎng)絡(luò)回復(fù)的處理。 |
QUrl url() const | 返回與網(wǎng)絡(luò)回復(fù)相關(guān)聯(lián)的URL。 |
QNetworkRequest request() const | 返回生成此網(wǎng)絡(luò)回復(fù)的網(wǎng)絡(luò)請(qǐng)求。 |
QNetworkAccessManager *manager() const | 返回與網(wǎng)絡(luò)回復(fù)相關(guān)聯(lián)的QNetworkAccessManager。 |
bool isFinished() const | 檢查網(wǎng)絡(luò)回復(fù)是否已完成。 |
QNetworkReply::NetworkError error() const | 返回網(wǎng)絡(luò)回復(fù)的錯(cuò)誤代碼。 |
bool hasRawHeader(const QByteArray &headerName) const | 檢查網(wǎng)絡(luò)回復(fù)是否包含指定原始頭。 |
QList<QByteArray> rawHeaderList() const | 返回網(wǎng)絡(luò)回復(fù)的所有原始頭的列表。 |
QByteArray rawHeader(const QByteArray &headerName) const | 返回指定原始頭的值。 |
QVariant header(QNetworkRequest::KnownHeaders header) const | 返回指定標(biāo)準(zhǔn)頭的值。 |
QList<QByteArray> rawHeaderValues(const QByteArray &headerName) const | 返回指定原始頭的所有值。 |
QVariant attribute(QNetworkRequest::Attribute code) const | 返回指定網(wǎng)絡(luò)請(qǐng)求屬性的值。 |
QIODevice *readAllStandardOutput() | 讀取標(biāo)準(zhǔn)輸出的所有數(shù)據(jù),并返回一個(gè)QIODevice,用于訪問讀取的內(nèi)容。 |
QIODevice *readAllStandardError() | 讀取標(biāo)準(zhǔn)錯(cuò)誤的所有數(shù)據(jù),并返回一個(gè)QIODevice,用于訪問讀取的內(nèi)容。 |
bool isReadable() const | 檢查網(wǎng)絡(luò)回復(fù)是否可讀取。 |
這些函數(shù)提供了對(duì)QNetworkReply
實(shí)例進(jìn)行各種操作和查詢的方法,包括讀取回復(fù)數(shù)據(jù)、處理SSL錯(cuò)誤、獲取請(qǐng)求信息、檢查錯(cuò)誤狀態(tài)等。開發(fā)者可以根據(jù)具體需求使用這些函數(shù)來有效地與網(wǎng)絡(luò)回復(fù)進(jìn)行交互。
1.3QNetworkRequest
以下是QNetworkRequest
類中的一些常用函數(shù)及其描述:
函數(shù) | 描述 |
---|---|
QNetworkRequest(const QUrl &url) | 使用給定的URL構(gòu)造一個(gè)QNetworkRequest實(shí)例。 |
void setUrl(const QUrl &url) | 設(shè)置QNetworkRequest的URL。 |
QUrl url() const | 返回與QNetworkRequest相關(guān)聯(lián)的URL。 |
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue) | 設(shè)置指定原始頭的值。 |
QByteArray rawHeader(const QByteArray &headerName) const | 返回指定原始頭的值。 |
bool hasRawHeader(const QByteArray &headerName) const | 檢查QNetworkRequest是否包含指定原始頭。 |
void setRawHeaderList(const QList<QByteArray> &headerList) | 設(shè)置所有原始頭的列表。 |
QList<QByteArray> rawHeaderList() const | 返回QNetworkRequest的所有原始頭的列表。 |
void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value) | 設(shè)置指定標(biāo)準(zhǔn)頭的值。 |
QVariant header(QNetworkRequest::KnownHeaders header) const | 返回指定標(biāo)準(zhǔn)頭的值。 |
void setAttribute(QNetworkRequest::Attribute code, const QVariant &value) | 設(shè)置指定網(wǎng)絡(luò)請(qǐng)求屬性的值。 |
QVariant attribute(QNetworkRequest::Attribute code) const | 返回指定網(wǎng)絡(luò)請(qǐng)求屬性的值。 |
void setSslConfiguration(const QSslConfiguration &config) | 設(shè)置SSL配置。 |
QSslConfiguration sslConfiguration() const | 返回SSL配置。 |
void setMaximumRedirectsAllowed(int maxRedirects) | 設(shè)置允許的最大重定向次數(shù)。 |
int maximumRedirectsAllowed() const | 返回允許的最大重定向次數(shù)。 |
void setOriginatingObject(QObject *object) | 設(shè)置發(fā)起此網(wǎng)絡(luò)請(qǐng)求的對(duì)象。 |
QObject *originatingObject() const | 返回發(fā)起此網(wǎng)絡(luò)請(qǐng)求的對(duì)象。 |
bool isEmpty() const | 檢查QNetworkRequest是否為空(未設(shè)置URL)。 |
這些函數(shù)提供了對(duì)QNetworkRequest
實(shí)例進(jìn)行各種操作和查詢的方法,包括設(shè)置和獲取頭信息、設(shè)置SSL配置、設(shè)置和獲取網(wǎng)絡(luò)請(qǐng)求屬性等。開發(fā)者可以根據(jù)具體需求使用這些函數(shù)來有效地構(gòu)建和管理網(wǎng)絡(luò)請(qǐng)求。
2.實(shí)現(xiàn)Web頁面訪問
要使用該模塊讀者應(yīng)該在*.pro
文件內(nèi)包含network
網(wǎng)絡(luò)模塊,并在頭文件中引入QNetworkAccessManager
、QNetworkReply
、QNetworkRequest
三個(gè)類,在建立訪問時(shí)首先使用QNetworkAccessManager
新增一個(gè)manager
管理類,并通過QNetworkRequest
類創(chuàng)建一個(gè)GET請(qǐng)求地址,通過使用manager.get
方法實(shí)現(xiàn)對(duì)特定頁面的訪問。
當(dāng)訪問完成時(shí)需要通過一個(gè)信號(hào)來實(shí)現(xiàn)對(duì)數(shù)據(jù)的處理,在QNetworkReply
類中包含有如下表所示的信號(hào)以供讀者使用,例如當(dāng)訪問被完成時(shí)則自動(dòng)觸發(fā)&QNetworkReply::finished
完成信號(hào),此時(shí)只需要對(duì)該信號(hào)進(jìn)行相應(yīng)的處理即可,通常會(huì)使用一個(gè)槽函數(shù)來處理它。
信號(hào) | 描述 |
---|---|
finished() | 當(dāng)網(wǎng)絡(luò)請(qǐng)求完成時(shí)發(fā)出。 |
downloadProgress(qint64, qint64) | 在下載過程中定期發(fā)出,提供下載進(jìn)度信息。參數(shù)為已下載的字節(jié)數(shù)和總字節(jié)數(shù)。 |
uploadProgress(qint64, qint64) | 在上傳過程中定期發(fā)出,提供上傳進(jìn)度信息。參數(shù)為已上傳的字節(jié)數(shù)和總字節(jié)數(shù)。 |
readyRead() | 當(dāng)有可讀取的數(shù)據(jù)時(shí)發(fā)出,用于通知應(yīng)用程序可以調(diào)用readAll()或read()方法以獲取更多數(shù)據(jù)。 |
error(QNetworkReply::NetworkError) | 當(dāng)網(wǎng)絡(luò)請(qǐng)求發(fā)生錯(cuò)誤時(shí)發(fā)出,參數(shù)為錯(cuò)誤代碼。 |
sslErrors(const QList<QSslError> &) | 當(dāng)SSL錯(cuò)誤發(fā)生時(shí)發(fā)出,參數(shù)為SSL錯(cuò)誤的列表。 |
這些信號(hào)提供了豐富的信息,使開發(fā)者能夠在不同階段處理網(wǎng)絡(luò)請(qǐng)求。同理,在下載和上傳過程中可以使用downloadProgress
和uploadProgress
信號(hào)來獲取進(jìn)度信息,readyRead
信號(hào)表示有可讀取的數(shù)據(jù),error
信號(hào)表示請(qǐng)求發(fā)生錯(cuò)誤,sslErrors
信號(hào)表示SSL
相關(guān)的錯(cuò)誤。
當(dāng)信號(hào)被觸發(fā)時(shí)則會(huì)通過QObject::connect
連接到對(duì)應(yīng)的槽函數(shù)上,如下案例中所示,在槽函數(shù)內(nèi)通過reply->attribute
方法我們獲取到此次響應(yīng)碼中的QNetworkRequest::HttpStatusCodeAttribute
屬性,該屬性用來指明本次訪問的狀態(tài)值。此類屬性也有許多可供參考,如下所示;
屬性 | 描述 |
---|---|
QNetworkRequest::HttpStatusCodeAttribute | HTTP響應(yīng)的狀態(tài)碼。 |
QNetworkRequest::HttpReasonPhraseAttribute | HTTP響應(yīng)的原因短語,如"OK"、"Not Found"等。 |
QNetworkRequest::RedirectionTargetAttribute | 重定向目標(biāo)的URL。 |
QNetworkRequest::ConnectionEncryptedAttribute | 連接是否加密的標(biāo)志,返回一個(gè)bool值。 |
QNetworkRequest::SourceIsFromCacheAttribute | 請(qǐng)求是否來自緩存的標(biāo)志,返回一個(gè)bool值。 |
QNetworkRequest::HttpPipeliningAllowedAttribute | 是否允許HTTP流水線傳輸?shù)臉?biāo)志,返回一個(gè)bool值。 |
QNetworkRequest::HttpPipeliningWasUsedAttribute | 是否使用了HTTP流水線傳輸?shù)臉?biāo)志,返回一個(gè)bool值。 |
QNetworkRequest::CustomVerbAttribute | 自定義請(qǐng)求動(dòng)作(HTTP verb)的字符串。 |
QNetworkRequest::User | 用戶自定義的屬性,用于存儲(chǔ)任意類型的用戶數(shù)據(jù)。 |
這些屬性提供了額外的信息,使得開發(fā)者能夠更全面地了解和處理網(wǎng)絡(luò)響應(yīng)。根據(jù)具體的應(yīng)用需求,開發(fā)者可以選擇使用這些屬性中的一個(gè)或多個(gè)來獲取所需的信息。
#include <QCoreApplication> #include <QNetworkAccessManager> #include <QNetworkReply> #include <QNetworkRequest> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 創(chuàng)建網(wǎng)絡(luò)訪問管理器 QNetworkAccessManager manager; // 創(chuàng)建GET請(qǐng)求 QNetworkRequest request(QUrl("http://www.baidu.com")); // 發(fā)送GET請(qǐng)求 QNetworkReply *reply = manager.get(request); // 連接信號(hào)槽,處理響應(yīng) QObject::connect(reply, &QNetworkReply::finished, [&]() { if (reply->error() == QNetworkReply::NoError) { // 獲取請(qǐng)求的 URL qDebug() << "Request URL:" << reply->request().url(); // 輸出請(qǐng)求頭信息 qDebug() << "Request Headers:"; QList<QByteArray> requestHeaders = reply->request().rawHeaderList(); foreach (const QByteArray &header, requestHeaders) { qDebug() << header << ":" << reply->request().rawHeader(header); } // 獲取響應(yīng)碼 int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); qDebug() << "HttpStatusCodeAttribute:" << statusCode; // 連接是否加密的標(biāo)志 bool connectionEncryptedAttribute = reply->attribute(QNetworkRequest::ConnectionEncryptedAttribute).toBool(); qDebug() << "ConnectionEncryptedAttribute:" << connectionEncryptedAttribute; // 請(qǐng)求是否來自緩存的標(biāo)志 bool sourceIsFromCacheAttribute = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); qDebug() << "SourceIsFromCacheAttribute:" << sourceIsFromCacheAttribute; // HTTP請(qǐng)求是否被允許進(jìn)行流水線處理的標(biāo)志 bool httpPipeliningAllowedAttribute = reply->attribute(QNetworkRequest::HttpPipeliningAllowedAttribute).toBool(); qDebug() << "HttpPipeliningAllowedAttribute:" << httpPipeliningAllowedAttribute; // 輸出響應(yīng)頭信息 qDebug() << "Response Headers:"; QList<QByteArray> responseHeaders = reply->rawHeaderList(); foreach (const QByteArray &header, responseHeaders) { qDebug() << header << ":" << reply->rawHeader(header); } // 處理響應(yīng)內(nèi)容,這里可以使用 readAll() 方法獲取響應(yīng)內(nèi)容 // qDebug() << "Response Content:" << reply->readAll(); } else { qDebug() << "Error:" << reply->errorString(); } // 釋放資源 reply->deleteLater(); QCoreApplication::quit(); }); return a.exec(); }
讀者可自行編譯并運(yùn)行這段代碼,觀察請(qǐng)求與相應(yīng)數(shù)據(jù)如下圖所示;
至于如何在圖形界面中使用則就更簡單了,首先我們?cè)?code>mainwindow.h頭文件中定義好所需要的兩個(gè)槽函數(shù),函數(shù)on_finished()
用于在完成請(qǐng)求后被調(diào)用,函數(shù)on_readyRead()
則用于在回調(diào)被執(zhí)行后調(diào)用,并并以兩個(gè)網(wǎng)絡(luò)管理類的指針變量,如下所示;
class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: //自定義槽函數(shù) void on_finished(); void on_readyRead(); void on_pushButton_clicked(); private: Ui::MainWindow *ui; QNetworkAccessManager networkManager; // 網(wǎng)絡(luò)管理 QNetworkReply *reply; // 網(wǎng)絡(luò)響應(yīng) };
當(dāng)獲取按鈕被點(diǎn)擊后則開始執(zhí)行讀入指定URL地址,并對(duì)該地址進(jìn)行網(wǎng)頁訪問,同時(shí)綁定這兩個(gè)信號(hào),一旦被觸發(fā)則自動(dòng)路由到對(duì)應(yīng)的槽函數(shù)上面去,如下所示;
void MainWindow::on_pushButton_clicked() { // 讀入U(xiǎn)RL地址 QString urlSpec = ui->lineEdit->text().trimmed(); if (urlSpec.isEmpty()) { QMessageBox::information(this, "錯(cuò)誤", "請(qǐng)指定URL"); return; } // 格式化URL QUrl newUrl = QUrl::fromUserInput(urlSpec); if (!newUrl.isValid()) { QMessageBox::information(this, "錯(cuò)誤", QString("無效URL: %1").arg(urlSpec)); return; } // 訪問頁面 reply = networkManager.get(QNetworkRequest(newUrl)); // 完成時(shí)的槽函數(shù)綁定 connect(reply, SIGNAL(finished()), this, SLOT(on_finished())); // 讀入數(shù)據(jù)的槽函數(shù)綁定 connect(reply, SIGNAL(readyRead()), this, SLOT(on_readyRead())); }
相對(duì)應(yīng)的,在on_finished()
槽函數(shù)中我們將響應(yīng)頭讀出并輸出到文本框中,在on_readyRead()
槽函數(shù)中則是對(duì)整個(gè)網(wǎng)站頁面源代碼的輸出功能,完整代碼如下所示;
void MainWindow::on_finished() { // 獲取響應(yīng)碼 int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if(statusCode == 200) { ui->plainTextEdit_2->appendPlainText("響應(yīng)頭數(shù)據(jù):"); // 輸出響應(yīng)頭信息 QList<QByteArray> responseHeaders = reply->rawHeaderList(); foreach (const QByteArray &header, responseHeaders) { ui->plainTextEdit_2->appendPlainText(header + " : " + reply->rawHeader(header)); } } } // 讀入頁面源代碼 void MainWindow::on_readyRead() { ui->plainTextEdit->setPlainText(reply->readAll()); }
運(yùn)行代碼,讀者可自行輸入特定的網(wǎng)站進(jìn)行讀取測(cè)試,如下所示(完整代碼請(qǐng)參考課件部分);
以上就是C++ Qt開發(fā)之使用QNetworkAccessManager實(shí)現(xiàn)Web網(wǎng)頁訪問的詳細(xì)內(nèi)容,更多關(guān)于Qt QNetworkAccessManager的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-05-05C++實(shí)現(xiàn)銀行排隊(duì)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)銀行排隊(duì)系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法
這篇文章主要介紹了Android App仿微信界面切換時(shí)Tab圖標(biāo)變色效果的制作方法,重點(diǎn)講解了圖標(biāo)的繪制技巧,需要的朋友可以參考下2016-04-04C/C++實(shí)現(xiàn)發(fā)送與接收HTTP/S請(qǐng)求的示例代碼
HTTP(Hypertext Transfer Protocol)是一種用于傳輸超文本的協(xié)議,它是一種無狀態(tài)的、應(yīng)用層的協(xié)議,用于在計(jì)算機(jī)之間傳輸超文本文檔,通常在 Web 瀏覽器和 Web 服務(wù)器之間進(jìn)行數(shù)據(jù)通信,本文給大家介紹了C/C++發(fā)送與接收HTTP/S請(qǐng)求,需要的朋友可以參考下2023-11-11