1.從git上同步項目
編譯測試,編譯通過
Post請求測試
測試成功
2. email is 打印有問題,檢查
解析結果是存儲在jsonResult中的,修改
3. 客戶端實現Post驗證碼請求
3.1 同步Qt客戶端項目
檢查QT版本,由于我在公司用的還是QT5.12.9,現在下一版5.14.2
https://download.qt.io/archive/qt/5.14/
選擇一下安裝目錄
選擇編譯器版本,不適用MingW因為打包容易產生庫的依賴缺失問題
3.2 配置系統環境
1. 右擊此電腦
2. 新增VSQT擴展編輯器版本
3. 編譯測試
圖片丟失,檢查
但是用QT5.12.9 就沒有問題
可能是安裝的時候缺失了什么吧
添加QTDesigner打開UI界面,看看是哪里出問題了
檢查了一遍UI發現沒有任何問題,重新編譯查看,一切正常
VS必須要自己配置打開UI的啟動器喔,如果不自己配置的話,容易打不開UI界面還可能只能打開代碼界面,或者一打開UI就閃退,配置.ui文件的打開方式,上面以及介紹了喔
3.3 開始實現Post請求,然后獲取服務器發來的驗證碼
如果郵箱格式正確就發送Http請求
/* 獲取驗證碼 */
void RegisterWidget::OnGetCodeButtonClicked()
{QString Email = ui.Email_Edit->text();// 設置正則表達式QRegularExpression Regex(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)");bool Match = Regex.match(Email).hasMatch();/* 如果郵箱格式正確 */ if (Match){// 發送Http驗證碼QJsonObject jsonHttpCode;jsonHttpCode.insert("email", Email);HttpManager::Instance()->PostHttpReq(QUrl("http://localhsot:8080//getVarifycode"),jsonHttpCode,ReqID::ID_GET_VARIFY_CODE,Modules::REGISTERMOD);}else{ShowTipLabel(QString::fromLocal8Bit("郵箱格式不正確"), "error");}
}
報錯了,QNetworkReply::UnknownServerError,拼寫錯誤,是host不是hsot
一切正確
4. Post請求的整體梳理
4.1 當獲取驗證碼按鈕點擊時
觸發該按鈕對應的回調函數,在回調里會先獲取郵箱文本,如果郵箱格式正確,會設置要發送的請求,即設置json
4.2 Http管理請求的對象發送該請求
1. 就是之前說過的,當服務器監聽8080端口號時發現有客戶端發來連接時,會分配一個socket套接字來管理該鏈接,然后繼續監聽8080端口;
這里對應的就是客戶端發來連接請求,還有對應的請求體request
QNetworkReply* reply = m_pNetworkAccessManager->post(request, data);
// 發送請求返回一個管理該連接的對象,如果服務器為該連接分配了套接字
2. 服務器會檢查是否是Post請求
至于如何解析Post請求的在前面的文章說過了,這里不再贅述,如果客戶端發來的json中有email這個key,說明解析成功了,然后回送響應
3. 客戶端解析服務器發來的響應
這里只是將服務器回送的響應從客戶端的接受緩沖區中全部讀出來,并填充到QString中了
具體的解析行為還是在注冊窗口里,解耦了,看課的代碼很多自己都記不下來,沒關系,重要的是掌握思想和整體脈絡,只要熟悉一遍了,自己再去搭服務器框架的時候,再猜猜坑,有些代碼背不住直接問AI讓他幫你生成就可以了
在獲取驗證碼的回調函數中,會檢查該回應是否成功
這個error key 是在服務器中添加到響應中的_response["error"]? = 0,這里修改一下魔法數字
最后就是獲取服務器響應報文中的email
至此整個客戶端向服務器發送Post請求的一整套邏輯已經跑了一遍,老實說,這套代碼讓我再敲一遍,我也敲不出來這么完整的框架出來,這也說明了彎路才是捷徑
5. 用Config文件來管理客戶端的參數
1. 新建Confin.ini,并添加現有項到自己的解決方案中
2. 填充Config.ini
[GateServer]
host=localhost
port=8080
target=getVarifycode
3. 讀取Config.ini?
根據我的開發經驗來說
一般直接用QDir::CurrPath + Config/Config.ini
或者“./Config/Config.ini”
目前來說沒出現過報錯
#ifndef GLOBAL_H
#define GLOBAL_H
#include <QWidget>
#include <functional>
#include <QRegularExpression>
#include "QStyle"#include <memory>
#include <iostream>
#include <mutex>#include <QString>// extern 聲明此變量是在其他文件中定義的全局變量
extern std::function<void(QWidget*)> repolish;extern QString ConfigPath; // 配置文件路徑#endif // GLOBAL_H
#include "Global.h"#include <QDir>// 初始化聲明的全局變量
std::function<void(QWidget*)> repolish = [](QWidget* Widget)
{Widget->style()->unpolish(Widget);Widget->style()->polish(Widget);
};// 配置文件路徑
QString ConfigPath = QDir::currentPath() + "/Config/Config.ini";
4. 用QSetting來管理這個config.ini
5. 重新定義創建URL的方式為讀取config的方式,來拼接URL