免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

Qt POST JSON 避坑指南:從QJsonObject到QNetworkReply完整封裝

Qt POST JSON 避坑指南:從QJsonObject到QNetworkReply完整封裝 簡(jiǎn)介面向Qt初學(xué)者與桌面應(yīng)用開(kāi)發(fā)者的HTTP網(wǎng)絡(luò)通信示例演示如何借助QNetworkAccessManager發(fā)起POST請(qǐng)求將QJsonDocument、QJsonObject構(gòu)造的JSON數(shù)據(jù)轉(zhuǎn)為字符串再經(jīng)toUtf8()編碼后作為請(qǐng)求體發(fā)送至服務(wù)器并正確處理響應(yīng)。工程配有簡(jiǎn)潔界面便于通過(guò)按鈕觸發(fā)請(qǐng)求并在界面上查看返回結(jié)果適合快速理解Qt網(wǎng)絡(luò)模塊、JSON序列化與異步信號(hào)槽的配合用法。資源包僅5個(gè)文件包含2個(gè)cpp、1個(gè)h、1個(gè)ui、1個(gè)procpp分別負(fù)責(zé)入口和主窗口邏輯h聲明網(wǎng)絡(luò)請(qǐng)求相關(guān)成員與槽函數(shù)ui定義可視布局pro聲明network、widgets等模塊依賴(lài)。整體壓縮包大小僅3KB結(jié)構(gòu)緊湊、無(wú)冗余資源可直接用Qt Creator打開(kāi)并編譯運(yùn)行適合作為輕量級(jí)參考工程。目前已有5380人學(xué)習(xí)。研讀源碼可掌握設(shè)置application/json請(qǐng)求頭、調(diào)用post()發(fā)送數(shù)據(jù)、通過(guò)信號(hào)槽接收服務(wù)端回包等關(guān)鍵寫(xiě)法也可作為向既有桌面程序集成網(wǎng)絡(luò)功能的起步模板。1. Qt 里 POST JSON 的坑十有八九不在網(wǎng)絡(luò)庫(kù)做 Qt 開(kāi)發(fā)用 Qthttp 發(fā) POST 請(qǐng)求、帶上 JSON body是再常見(jiàn)不過(guò)的需求登錄鑒權(quán)、狀態(tài)上報(bào)、調(diào)用開(kāi)放的接口服務(wù)幾乎每個(gè)項(xiàng)目都會(huì)碰到。很多朋友從網(wǎng)上找一段 postjson 的示例抄過(guò)來(lái)結(jié)果服務(wù)端要么收到空 body要么返回亂碼要么請(qǐng)求發(fā)出去之后石沉大海連回調(diào)都不觸發(fā)。這時(shí)候最容易懷疑 Qt 的 HTTP 模塊不靠譜但根據(jù)我拆過(guò)的一堆案例來(lái)看問(wèn)題大多出在三個(gè)地方請(qǐng)求頭 Content-Type 沒(méi)和服務(wù)端對(duì)齊、JSON 序列化格式選錯(cuò)、QNetworkReply 的生命周期沒(méi)管住。這篇文章從 QJsonObject 怎么組裝、QNetworkRequest 怎么配置一直講到 QNetworkReply 怎么安全收尾最后給出一套適合工程落地的封裝思路。適合正在用 C/Qt 對(duì)接服務(wù)端接口的開(kāi)發(fā)者也適合剛看懂示例但一改就翻車(chē)的新手。2. POST JSON 最小鏈路從 QJsonObject 到 QNetworkReply 的完整流程2.1 QNetworkAccessManager 的生命周期與選型在 Qt 里發(fā) HTTP 請(qǐng)求核心門(mén)面是 QNetworkAccessManager連接管理、請(qǐng)求調(diào)度、代理設(shè)置、SSL session 緩存都由它統(tǒng)一管理。我一般建議一個(gè)程序生命周期里只創(chuàng)建它一次長(zhǎng)期復(fù)用。原因很簡(jiǎn)單它內(nèi)部維護(hù)了 DNS 緩存、SSL session 緩存和底層的連接池如果你每次請(qǐng)求都 new 一個(gè)再 delete這些緩存全部作廢表現(xiàn)就是請(qǐng)求變慢、并發(fā)上來(lái)之后反復(fù)握手。這個(gè)差異在局域網(wǎng)接口上不明顯一旦連公網(wǎng)服務(wù)體感差距就很明顯。QNetworkAccessManager 的線(xiàn)程模型需要說(shuō)一下它是可重入的也就是說(shuō)不同實(shí)例可以分配在不同線(xiàn)程使用但同一個(gè)實(shí)例不建議跨線(xiàn)程調(diào)用。實(shí)際項(xiàng)目里最常見(jiàn)的做法是把 manager 放在主線(xiàn)程所有 post 都在主線(xiàn)程發(fā)起如果必須在工作線(xiàn)程用就讓那個(gè)線(xiàn)程自己創(chuàng)建自己的 manager不要共享。聲明一個(gè)請(qǐng)求用 QNetworkRequest最基礎(chǔ)的配置是這樣QNetworkRequest request; request.setUrl(QUrl(https://api.example.com/v1/user/login)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json);URL 這塊有個(gè)很容易忽略的細(xì)節(jié)如果地址里帶了中文參數(shù)、空格或者特殊符號(hào)直接丟給 setUrl最終發(fā)送的字節(jié)可能是錯(cuò)的服務(wù)端收到之后要么 404要么參數(shù)解析不對(duì)。常見(jiàn)的做法是先對(duì)查詢(xún)參數(shù)做百分號(hào)編碼或者直接用 QUrlQuery 構(gòu)造查詢(xún)串后面 3.3 節(jié)會(huì)專(zhuān)門(mén)講。2.2 JSON 構(gòu)造與序列化別用手拼字符串很多人喜歡這樣拼 JSONQString({name:%1,age:%2}).arg(name).arg(age)。這種寫(xiě)法在小字段場(chǎng)景下能用但一旦字段值里出現(xiàn)引號(hào)、反斜杠、換行你就要自己處理轉(zhuǎn)義而服務(wù)端 JSON 解析器是零容忍的只要有一處引號(hào)不對(duì)稱(chēng)整個(gè)請(qǐng)求直接拒收。正確做法是先用 QJsonObject 組織數(shù)據(jù)再交給 QJsonDocument 序列化QJsonObject body; body.insert(username, demo); body.insert(age, 28); body.insert(active, true); QJsonDocument doc(body); QByteArray payload doc.toJson(QJsonDocument::Compact);toJson 有兩種常用模式Compact 和 Indented。Compact 是緊湊輸出不換行不加空格網(wǎng)絡(luò)傳輸一般用這個(gè)體積最小Indented 是格式化輸出帶換行和縮進(jìn)適合打印日志和寫(xiě)配置文件。我見(jiàn)過(guò)有人把默認(rèn)的 Indented 格式直接發(fā)出去服務(wù)端也認(rèn)因?yàn)?JSON 規(guī)范本身允許空白字符但少數(shù)嚴(yán)格的服務(wù)端會(huì)拿 Content-Length 和實(shí)際接收體做一致性校驗(yàn)這種場(chǎng)景下 Compact 更穩(wěn)妥。發(fā) POST 請(qǐng)求時(shí)payload 必須先轉(zhuǎn)成 QByteArray 傳進(jìn)去。如果你直接傳 QJsonObjectQt 的重載可能會(huì)把它按表單字段處理服務(wù)端按 JSON 解析時(shí)什么都拿不到。QNetworkAccessManager manager; QNetworkReply *reply manager.post(request, payload);2.3 異步接收f(shuō)inished 信號(hào)與數(shù)據(jù)讀取post() 調(diào)用之后請(qǐng)求是異步的底層 socket 的讀寫(xiě)不阻塞調(diào)用線(xiàn)程響應(yīng)到了之后通過(guò)信號(hào)通知。標(biāo)準(zhǔn)寫(xiě)法是把回調(diào)接在 QNetworkReply 的 finished 信號(hào)上connect(reply, QNetworkReply::finished, this, [reply]() { if (reply-error() ! QNetworkReply::NoError) { qWarning() HTTP error: reply-errorString(); reply-deleteLater(); return; } QByteArray respData reply-readAll(); qDebug() raw response: respData; QJsonParseError parseErr; QJsonDocument respDoc QJsonDocument::fromJson(respData, parseErr); if (parseErr.error ! QJsonParseError::NoError) { qWarning() JSON parse failed: parseErr.errorString(); } reply-deleteLater(); });readAll() 的調(diào)用時(shí)機(jī)必須在 finished 之后在那之前讀可能讀到空數(shù)據(jù)或半截請(qǐng)求體。另外一個(gè)容易踩的細(xì)節(jié)是同一個(gè) reply 上的數(shù)據(jù)只能讀一次readAll() 之后內(nèi)部緩沖區(qū)就空了連續(xù)調(diào)第二次拿到的是空字節(jié)。不管請(qǐng)求成功還是失敗reply 最終都要 deleteLater() 釋放否則每次請(qǐng)求泄漏一塊內(nèi)存惡劣場(chǎng)景下跑一天內(nèi)存占用漲幾百兆。connect 時(shí)把 this 作為上下文對(duì)象傳進(jìn)去是一個(gè)值得堅(jiān)持的習(xí)慣。這樣當(dāng) this 指向的對(duì)象先被銷(xiāo)毀時(shí)lambda 不會(huì)再被觸發(fā)避免在回調(diào)里訪(fǎng)問(wèn)懸垂對(duì)象導(dǎo)致崩潰。2.4 請(qǐng)求頭參數(shù)明細(xì)與常見(jiàn)誤設(shè)POST JSON 場(chǎng)景下請(qǐng)求頭直接影響服務(wù)端怎么解釋你的請(qǐng)求體這里集中列一張表Header 名推薦值說(shuō)明Content-Typeapplication/json服務(wù)端按這個(gè)決定走 JSON 解析分支部分框架要求寫(xiě)成 application/json; charsetutf-8Content-Lengthpayload.size()Qt 會(huì)自動(dòng)計(jì)算手動(dòng)設(shè)置更明確Acceptapplication/json期望服務(wù)端返回 JSONUser-Agent自定義字符串個(gè)別網(wǎng)關(guān)會(huì)攔空 UA 請(qǐng)求Connection不手動(dòng)設(shè)Qt 默認(rèn)支持 keep-alive手動(dòng)改反而多事兩個(gè)容易迷糊的點(diǎn)。第一所有 header 必須在 post() 之前設(shè)置完成先發(fā)請(qǐng)求再補(bǔ) header很可能不生效抓包看到的還是老請(qǐng)求頭。第二setHeader 和 setRawHeader 不要混著設(shè)置同一個(gè)字段繞來(lái)繞去容易產(chǎn)生兩個(gè)同名 header部分服務(wù)端看到重復(fù)頭直接報(bào)錯(cuò)。我在實(shí)際對(duì)接里就遇到過(guò)網(wǎng)關(guān)打印出兩個(gè) Content-Type 的情況排查半天發(fā)現(xiàn)是代碼里兩處都設(shè)了。3. JSON 組裝與解析嵌套結(jié)構(gòu)、數(shù)組與類(lèi)型陷阱3.1 嵌套構(gòu)造對(duì)象套數(shù)組數(shù)組套對(duì)象真實(shí)業(yè)務(wù)里的接口很少只有三五個(gè)平鋪?zhàn)侄?。登錄接口可能帶一個(gè) user 對(duì)象上報(bào)接口通常是一個(gè) events 數(shù)組數(shù)組里每個(gè)元素又是一個(gè)獨(dú)立對(duì)象。QJsonObject 和 QJsonArray 可以互相嵌套寫(xiě)法上先構(gòu)造內(nèi)層再組裝外層代碼會(huì)清晰很多QJsonObject userInfo; userInfo[uid] 10086; userInfo[nickname] dev; QJsonObject loginBody; loginBody[user] userInfo; loginBody[device] PC; QJsonArray events; QJsonObject ev1; ev1[type] click; ev1[page] /home; events.append(ev1); QJsonObject ev2; ev2[type] scroll; ev2[page] /list; events.append(ev2); loginBody[events] events;這段代碼最終生成的 JSON 結(jié)構(gòu)是{ user: {uid: 10086, nickname: dev}, device: PC, events: [ {type: click, page: /home}, {type: scroll, page: /list} ] }構(gòu)造時(shí)有幾個(gè)需要注意的行為。QJsonObject 的 operator[] 用于寫(xiě)入時(shí)如果 key 不存在會(huì)自動(dòng)創(chuàng)建這對(duì)構(gòu)造是方便的但如果你想先判斷 key 是否存在再?zèng)Q定是否寫(xiě)入要用 contains()。另外QJsonObject 內(nèi)部的組織順序在不同 Qt 版本之間并不一致官方也沒(méi)有承諾保持插入順序。如果你的業(yè)務(wù)依賴(lài) JSON 字段順序來(lái)生成簽名比如某些支付接口要求把所有字段按字典序排序再拼串那就不要依賴(lài) QJsonObject 的遍歷順序應(yīng)該拿到鍵名之后自己排序。3.2 防御性解析先判類(lèi)型再取值服務(wù)端返回的 JSON 往往比請(qǐng)求要復(fù)雜得多。有的接口成功時(shí)返回 object失敗時(shí)返回 {code: 400, message: ...}還有的接口干脆返回?cái)?shù)組。解析端我強(qiáng)烈建議養(yǎng)成“類(lèi)型先判斷、取值有兜底”的寫(xiě)法QJsonParseError parseErr; QJsonDocument respDoc QJsonDocument::fromJson(respData, parseErr); if (parseErr.error ! QJsonParseError::NoError) { qWarning() parse error: parseErr.errorString(); return; } if (!respDoc.isObject()) { qWarning() response is not an object; return; } QJsonObject root respDoc.object(); if (root.contains(code) root[code].isDouble()) { int code root[code].toInt(); if (code ! 0) { qWarning() business error: root[message].toString(); return; } } if (root.contains(data) root[data].isObject()) { QJsonObject dataObj root[data].toObject(); QString token dataObj[token].toString(); } if (root.contains(list) root[list].isArray()) { QJsonArray list root[list].toArray(); for (const QJsonValue val : list) { if (!val.isObject()) continue; QJsonObject item val.toObject(); QString name item[name].toString(); } }這樣寫(xiě)的好處是字段缺失和類(lèi)型不符合都會(huì)被擋在門(mén)外不會(huì)因?yàn)橐粋€(gè)字段解析失敗導(dǎo)致整個(gè)響應(yīng)白拿。有一個(gè)容易誤判的地方value(code).toInt(-1) 這種寫(xiě)法缺 key 時(shí)返回 -1但 key 存在且類(lèi)型是 string 時(shí)toInt 可能返回 0 而不是 -1所以更穩(wěn)妥的判斷方式是先 contains 再取值。3.3 細(xì)節(jié)三件套緊湊格式、URL 編碼與小數(shù)精度第一件發(fā)送和打印用不同格式。發(fā)送時(shí)用 Compact 緊湊序列化日志里打印請(qǐng)求體時(shí)改用 Indented人眼更容易核對(duì)嵌套關(guān)系。同一個(gè) QJsonObject 可以隨時(shí)轉(zhuǎn)換兩種字節(jié)流不沖突。第二件URL 查詢(xún)參數(shù)編碼。很多接口要求在 URL 里帶簽名和時(shí)間戳如果簽名值里出現(xiàn) 、、 這類(lèi)字符直接拼進(jìn) URL 會(huì)導(dǎo)致參數(shù)被拆分。正確做法是用 QUrlQuery 構(gòu)造QUrlQuery query; query.addQueryItem(app_id, demo); query.addQueryItem(sign, signStr); QUrl url(https://api.example.com/v1/order/create); url.setQuery(query);QUrlQuery 會(huì)自動(dòng)完成百分號(hào)編碼服務(wù)端解碼后拿到的值和本地計(jì)算一致。第三件小數(shù)精度。QJsonValue 對(duì)數(shù)字只區(qū)分 double 和整數(shù)如果你從 double 填進(jìn) QJsonObject接收端拿到的就是帶小數(shù)的值。涉及金額計(jì)算時(shí)浮點(diǎn)誤差會(huì)累積建議約定以“分”為單位的整數(shù)來(lái)傳避免兩個(gè)端對(duì)不上賬。4. 同步等待與超時(shí)控制既要結(jié)果同步也要死等可控4.1 QEventLoop 把異步請(qǐng)求改成本地等待Qt 的 HTTP 請(qǐng)求本質(zhì)是異步的但很多業(yè)務(wù)邏輯是線(xiàn)性的先登錄拿 token再帶 token 請(qǐng)求數(shù)據(jù)。拆成信號(hào)槽一層層回調(diào)也能寫(xiě)但回調(diào)嵌套多了以后可讀性和排錯(cuò)成本都會(huì)上升。一個(gè)常見(jiàn)的做法是借用 QEventLoop 把“異步請(qǐng)求 等待完成”包裝成同步函數(shù)。這個(gè)寫(xiě)法適合命令行工具、后臺(tái)任務(wù)線(xiàn)程這類(lèi)場(chǎng)景。注意如果跑在 UI 線(xiàn)程進(jìn)入事件循環(huán)會(huì)阻塞界面刷新用戶(hù)看到的就是界面卡死所以 GUI 程序里不要在主線(xiàn)程做這種同步等待。QByteArray postJson(const QJsonObject body) { QNetworkAccessManager manager; QNetworkRequest request; request.setUrl(QUrl(https://api.example.com/v1/rpc)); request.setHeader(QNetworkRequest::ContentTypeHeader, application/json); QByteArray payload QJsonDocument(body).toJson(QJsonDocument::Compact); QNetworkReply *reply manager.post(request, payload); QEventLoop loop; QObject::connect(reply, QNetworkReply::finished, loop, QEventLoop::quit); QTimer timer; timer.setSingleShot(true); QObject::connect(timer, QTimer::timeout, reply, QNetworkReply::abort); timer.start(3000); loop.exec(); QByteArray result; if (reply-error() QNetworkReply::NoError) { result reply-readAll(); } reply-deleteLater(); return result; }這里的關(guān)鍵設(shè)計(jì)是超時(shí)觸發(fā)時(shí) abort 中斷請(qǐng)求隨后 reply 的 finished 信號(hào)依然會(huì)發(fā)出來(lái)把 loop 的 quit 兜住不會(huì)出現(xiàn)死等。如果只等 finished 而不管超時(shí)遇到服務(wù)端遲遲不響應(yīng)線(xiàn)程就真的掛死了。deleteLater 放在 loop.exec() 返回之后執(zhí)行是安全的因?yàn)榇藭r(shí)請(qǐng)求已經(jīng)結(jié)束或者被 abort。4.2 超時(shí)設(shè)置setTransferTimeout 與單請(qǐng)求兜底如果你用的是 Qt 5.15 及以上版本QNetworkAccessManager 自帶 transfer timeout按毫秒設(shè)置manager.setTransferTimeout(5000);這個(gè)超時(shí)對(duì)該 manager 后續(xù)所有請(qǐng)求生效。需要注意它的語(yǔ)義它是指“無(wú)數(shù)據(jù)活動(dòng)超時(shí)”不是“整個(gè)請(qǐng)求的總時(shí)限”。也就是說(shuō)一個(gè)請(qǐng)求持續(xù)在傳數(shù)據(jù)哪怕已經(jīng)跑了 30 秒它也不會(huì)被掐斷。這和很多服務(wù)端框架里的“總超時(shí)”概念不完全一樣對(duì)接時(shí)要心里有數(shù)。Qt 5.15 之前的版本沒(méi)有這個(gè)接口更早版本的兼容做法就是第 4.1 節(jié)里那樣用單次 QTimer 配合 reply-abort()。有一個(gè)常見(jiàn)的誤用在 QTimer 的槽里直接調(diào) loop.quit()而不是先 abort。表面上循環(huán)退出了但請(qǐng)求還在后臺(tái)繼續(xù)跑后續(xù) finished 信號(hào)仍然會(huì)觸發(fā)線(xiàn)程退出時(shí)可能帶出一堆“connection closed”之類(lèi)的噪音。還有一個(gè)值得避免的寫(xiě)法不要在一個(gè) QEventLoop 里再嵌套另一個(gè) QEventLoop 去等新的 HTTP 請(qǐng)求。我見(jiàn)過(guò)有人在 finished 回調(diào)里又起一個(gè)新的 loop 去等下一個(gè)管理器的請(qǐng)求理論上能跑但其中一個(gè)超時(shí)沒(méi)兜住整個(gè)線(xiàn)程就僵住不動(dòng)。連續(xù)多段請(qǐng)求的正確做法是把它們串成隊(duì)列或者像第 2 章那樣用異步回調(diào)鏈。5. 避坑與排查POST JSON 最常翻車(chē)的五個(gè)現(xiàn)場(chǎng)5.1 服務(wù)端收到空 bodyContent-Type 與序列化格式?jīng)]對(duì)上現(xiàn)象接口返回 HTTP 200但服務(wù)端業(yè)務(wù)日志顯示收到的 body 是空的或者字段全是 null。原因最常見(jiàn)的有三種。第一post() 時(shí)直接傳了 QJsonObject沒(méi)有先 toJsonQt 按表單編碼處理服務(wù)端走 JSON 解析自然拿不到。第二Content-Type 沒(méi)設(shè)或者設(shè)成了 text/plain服務(wù)端沒(méi)走 JSON 解析分支。第三URL 拼錯(cuò)導(dǎo)致請(qǐng)求打到了另一個(gè)接口上這個(gè)在 5.5 節(jié)單獨(dú)說(shuō)。解決把 payload 先用 qDebug() 打印出來(lái)確認(rèn)它是一段合法 JSON再確認(rèn)請(qǐng)求頭里的 Content-Type 是 application/json最后在調(diào)試代理里看實(shí)際發(fā)出的 body 內(nèi)容判斷丟在哪一環(huán)。5.2 返回中文亂碼或 \uXXXX編碼和解碼不在同一條鏈上現(xiàn)象響應(yīng)里的中文變成“錕斤拷”之類(lèi)的亂碼或者所有中文都變成 \uXXXX 轉(zhuǎn)義串。原因HTTP 響應(yīng)頭沒(méi)有聲明 charset 時(shí)Qt 默認(rèn)按 UTF-8 讀取如果服務(wù)端返回的是 GBK讀出來(lái)就是亂碼。\uXXXX 其實(shí)是 JSON 規(guī)范里的標(biāo)準(zhǔn)轉(zhuǎn)義不代表數(shù)據(jù)錯(cuò)誤只是還沒(méi)解碼顯示。解決先看原始字節(jié)。遇到亂碼先不要急著接 QJsonDocument先打印原始響應(yīng)或按十六進(jìn)制看字節(jié)確定服務(wù)端實(shí)際編碼。如果是 GBKQt 5 里可以用 QString::fromLocal8Bit 或 QTextCodec 的 GBK codec 轉(zhuǎn)成 Unicode再喂給 fromJson。Qt 6 里 QTextCodec 挪到了兼容模塊接口對(duì)接文檔里一般會(huì)注明。5.3 HTTPS 證書(shū)驗(yàn)證失敗本地調(diào)試與正式環(huán)境要分開(kāi)對(duì)待現(xiàn)象請(qǐng)求本地開(kāi)發(fā)環(huán)境的 HTTPS 接口時(shí)報(bào) SSL handshake failed 或者 certificate signed by unknown authority。原因本地聯(lián)調(diào)的 HTTPS 服務(wù)大多使用自簽證書(shū)Qt 默認(rèn)的證書(shū)鏈校驗(yàn)不認(rèn)這個(gè)證書(shū)。解決開(kāi)發(fā)環(huán)境可以臨時(shí)放行。比較穩(wěn)妥的做法是連接 reply 的 sslErrors 信號(hào)在回調(diào)里打印出錯(cuò)信息然后調(diào)用帶參數(shù)版本的 ignoreSslErrors只放行當(dāng)前這幾條錯(cuò)誤不要無(wú)腦調(diào)用無(wú)參版本把未來(lái)所有證書(shū)錯(cuò)誤全部忽略。這個(gè)妥協(xié)手段只適合本地調(diào)試測(cè)試和正式環(huán)境必須走正規(guī)證書(shū)鏈否則中間人改數(shù)據(jù)沒(méi)有任何提醒安全邊界形同虛設(shè)。5.4 reply 泄漏與隨機(jī)崩潰生命周期沒(méi)理順現(xiàn)象程序運(yùn)行一段時(shí)間后隨機(jī)崩潰崩潰棧指向 QNetworkReply 相關(guān)或者內(nèi)存占用持續(xù)上漲。原因reply 沒(méi)有按規(guī)矩 deleteLater每次請(qǐng)求泄漏一點(diǎn)內(nèi)存另一種隱蔽情況是在兩次事件循環(huán)里對(duì)同一個(gè) reply 調(diào)了多次 deleteLater第二次就是懸垂操作。解決統(tǒng)一在 finished 回調(diào)里先讀數(shù)據(jù)、再 deleteLater絕不在 finished 之前刪除 replylambda 捕獲的 reply 指針一定要在連接銷(xiāo)毀前保持有效。connect 時(shí)帶上上下文對(duì)象比如 connect(reply, QNetworkReply::finished, this, lambda)一旦 this 對(duì)象先銷(xiāo)毀回調(diào)自動(dòng)斷開(kāi)能規(guī)避一大批懸垂崩潰。5.5 請(qǐng)求沒(méi)有響應(yīng)先查 URL 編碼和 JSON 合法性再查事件循環(huán)現(xiàn)象POST 發(fā)出去之后什么回調(diào)都不觸發(fā)程序不報(bào)錯(cuò)也不崩潰就像請(qǐng)求被黑洞吞了。原因常見(jiàn)兩種。一是 URL 帶了未編碼的中文或特殊字符QNetworkAccessManager 對(duì)非法 URL 的處理很安靜沒(méi)有顯式錯(cuò)誤信號(hào)表現(xiàn)就是沒(méi)任何回調(diào)二是代碼跑在一個(gè)沒(méi)有事件循環(huán)的線(xiàn)程里QNetworkAccessManager 的信號(hào)派發(fā)依賴(lài)事件循環(huán)循環(huán)不跑finished 永遠(yuǎn)不會(huì)觸發(fā)。解決第一步把 URL 打印出來(lái)確認(rèn) setUrl 前已經(jīng)做了百分號(hào)編碼第二步檢查當(dāng)前線(xiàn)程有沒(méi)有事件循環(huán)沒(méi)有就換到有循環(huán)的線(xiàn)程或者用第 4 章的同步等待方式第三步給請(qǐng)求加兜底超時(shí)確保任何情況下都不會(huì)無(wú)限等下去。6. 收尾建議把 POST JSON 封裝成公共調(diào)用工具6.1 封裝一個(gè)帶回調(diào)的 postJson最后一個(gè)建議把項(xiàng)目里所有 POST JSON 的調(diào)用收斂到一個(gè)公共位置不要散落在各個(gè)界面類(lèi)里。通常我會(huì)封裝一個(gè) HttpManager 類(lèi)內(nèi)部持有唯一的 QNetworkAccessManager對(duì)外只暴露一個(gè) postJson 接口加上完成回調(diào)void HttpManager::postJson(const QUrl url, const QJsonObject body, std::functionvoid(QJsonObject, int) done) { QNetworkRequest req(url); req.setHeader(QNetworkRequest::ContentTypeHeader, application/json); req.setRawHeader(Accept, application/json); QByteArray payload QJsonDocument(body).toJson(QJsonDocument::Compact); QNetworkReply *reply m_manager.post(req, payload); connect(reply, QNetworkReply::finished, this, [reply, done]() { QJsonObject respObj; int status reply-attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (reply-error() QNetworkReply::NoError) { QJsonParseError err; QJsonDocument doc QJsonDocument::fromJson(reply-readAll(), err); if (err.error QJsonParseError::NoError doc.isObject()) { respObj doc.object(); } } done(respObj, status); reply-deleteLater(); }); }這樣外部調(diào)用只需要關(guān)心數(shù)據(jù)組裝和結(jié)果回調(diào)網(wǎng)絡(luò)細(xì)節(jié)全部收進(jìn)類(lèi)里。6.2 日志、狀態(tài)碼與簡(jiǎn)單重試在封裝基礎(chǔ)上我會(huì)再加兩條習(xí)慣。第一請(qǐng)求發(fā)出時(shí)打一行“方法 URL payload”日志響應(yīng)收到后打一行“狀態(tài)碼 錯(cuò)誤串 耗時(shí)”排查問(wèn)題不再需要臨時(shí)加調(diào)試語(yǔ)句。第二加一個(gè)簡(jiǎn)單重試失敗且狀態(tài)碼是 5xx 或網(wǎng)絡(luò)錯(cuò)誤時(shí)重新調(diào)用 postJson最多重試兩次每次間隔 300 毫秒覆蓋大多數(shù)偶發(fā)超時(shí)和瞬時(shí)抖動(dòng)。另外如果是 Qt 5.15 以上給 manager 設(shè)一次 setTransferTimeout(8000) 做全局兜底比每個(gè)請(qǐng)求單獨(dú)開(kāi)定時(shí)器省心GUI 程序優(yōu)先走異步回調(diào)腳本和后臺(tái)線(xiàn)程再考慮 QEventLoop 同步等待。我從做第一個(gè) Qt 網(wǎng)絡(luò)模塊的模擬項(xiàng)目開(kāi)始每次接口對(duì)接都強(qiáng)制走一遍自檢鏈先打印請(qǐng)求報(bào)文再核對(duì) Content-Type然后確認(rèn) reply 生命周期最后看響應(yīng)原始字節(jié)。這套流程讓我少踩了無(wú)數(shù)坑現(xiàn)在新項(xiàng)目第一天就把 HttpClient 封裝好后面每個(gè)接口只改 JSON 結(jié)構(gòu)和回調(diào)邏輯翻車(chē)率低了很多。希望幫你把 POST JSON 這條路走順。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99在线免费观看| 激情综合五月婷婷| 91人人爽狠狠狠| 五月婷婷六月色| 九九99在线| 日本五月天激情| Av在线资源| 色五婷婷开心缴| 亚洲操B视频| 96精品久久久久久久久| 精品成人久久久久久久_一二三四视| 久草婷婷网 | 九九亚洲视频| 综合久久丁丁香婷| 婷婷97| 99re热在线视频| 六月丁香网| 亚洲瑟瑟精品在线| 久操操| 被强行糟蹋的女人A片| 青青草原99热| 九九伊人网| 久草热8精品视频在线观看| 伊人久久五月天| 色哟哟性爱av| 婷婷视频在线碰| 婷婷五月激情丁香| 天天天摸夜夜夜玩| 另类专区在线观看| 在线可以看的av网址| 91日韩美女被插视频| 97色婷婷成人综合在线观看| 国产26uuu| 丁香五月婷婷啪| 中字幕视频在线永久在线观看免费| 婷婷.com| 人人操A| www.色色com| 亭亭玉月丁香| 五月播播| 五月在线婷色| 99欧美| 九 九九九AV| 99热老网站| 亚州日本欧州韩美高青高潮一| 婷婷九月亚洲| 26uuu丁香婷婷五月| 五月天丁香| 五月婷婷真爱激情网| 色综合激情| 丁香五月婷婷总啪啪| 激情综合久久| 激情丁香六月| 影音先锋一区二区三区| www.亭亭五月天| 久久婷婷影院| 亚洲国产婷婷色五月| 大地9中文在线观看免费高清| 操操人人| 激情六月综合| 思思热在线观看| 国产精品日日躁夜夜躁| 99热在线观看亚洲区| 久久婷婷五月综合97色一本| 九九99免费视频| 一二线视频 另类| 五月丁香婷婷综合网| www.夜夜操| 丁香婷婷六月在线资源观看| 综合久久六月| 五月天另类激情在线| 五月天色婷婷网| 九九成人精品| 色五月丁香五月婷婷五月成人网 | 2015WWW永久免费观看播放| 久/久精品99看9| 五月天婷婷丁香导航| 久久婷婷婷婷伊人| 99re这里只有精品国产99| 中文字幕97超级碰| 欧美激情丁香五月| 成人网丁香五月| 九九热这里精品| 精品五月花| 五月丁香免费视频| 亚洲V国产V欧美V久久久久久| 婷婷网五月天| 开心五月婷婷| 成人婷婷五月天| 啪啪色激情五月天| 九九热这里只有精品31| 成人在线视频一区| 欧美va视频| 操一区| 成人在线网| 久久久WWW| 激情五月综合| 日本婷婷| 99九九精品视频推荐| 久久桃花网色婷婷| 99精品视频偷拍| 超碰亚洲天堂| 人妻操在线看| 超碰免费大香蕉| 99精品热视频| 大香蕉综合在线| 97资源欧美日韩大香蕉超碰一区| 五月天激情综合网站| 亚洲婷婷月丁香五月| 五月在在观看| 中文av网站| 另类激情综合| 色婷婷AV久久久久久久| 人人摸人人摸| 久久99免费视频网站| 色五月婷婷在线观看第一页舔| 啪啪啪丁香五月| 大香蕉娱乐| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 激情婷婷色色| 伊人久久丁香婷婷六月五月综合| 五月激情网站| 色综合久久888| www九九免费视频| 97色视频网| 婷婷操逼| 殴美综合激情五月天免费视频| 丁香久久| 91精品视频男人的天堂| 婷婷丁香久久五月综合| 婷婷综合五月| 草榴视频黄色网| 综合久久高清| 五月丁香婷婷综合网| 开心激情五月天网| 超碰日日操| 美女va| 婷婷五月天综合小说网| 激情小说五月天| 在线日韩av| 月色色综合婷婷网| 我要射综合| 深爱丁香激情| 亚洲情欲| 五月天激情综合网| 9热精品| 伊人色综合影院视频| 天天色播| 亚洲精品永久久久久久| 亚洲乱码日产精品BD| 丁香五月综合激情啪啪| 五月丁香六月婷婷成人电影| 五月婷中文娱乐综合| 看黄的网站18禁| 日本人人xxx| 爱射综合| 色色五月婷婷| 日本五月婷| 色99免费视频中文| 日本色爽| 密视AV综合在线| 丁香五月第九色| 五月天婷婷免费| 丁香六月天婷婷色| 六月亭亭久久综合激情| 狠狠爱成人综合网| 亚洲人人干| 六月天无码网址| 五月丁香激情四射| 九九九九九九热| 综合久久99| 中文成人在线| 婷婷色五月色妇| 五月天激情小说网| 超碰97在线观看免费| 激情五月六月婷婷综合啪啪| 青青草视频免费观看| 色婷天天| 色热久资源| 久热 91| 天堂在线婷婷| 久久99热这里只频精品6学生| 久婷婷视平| 亚洲激情免费久久| 五月丁香免费看| 狠狠色 综合色区| 丁香五月天婷婷久久综合| 色五月播五月| 色色色色色色色色五月先| 久色| 色色色综合| 久婷狼色诱惑在线| 色97综合婷婷天天色| 九九無妻| 色综合色色| 丁香六月伊人| 久久五月天激情| 色婷婷五月天不卡| 色欲一区二区三区精品A片| 丁香婷婷社区| www.99情趣网| 亚洲超碰在线| 桔色成人官方网站| 亚洲成av人影院| 欧洲99视频在线| 九九热最新| 亚洲免费成人电影AV| www激情| 色五婷婷| 最近中文字幕2019视频1| 热99热| 性色九九| 99久久久| 亚洲精品V天堂中文字幕| 色高清无码视频| 久操香蕉| www.婷婷五月| 在线可以看的av网址| 婷婷色中文| 精品久久99码| 操骚货在线| 亚洲婷婷视频| 人妻aV在线| 丁香五月天堂| 丁香蜜臀黄色婷婷五月天| 99色色网站| 天堂网亚洲色图| 人妻无码精品一区| 激情图片五月天| 思思热天天看| 97碰人人操| 激情综合五月激情17| 日本精品人妻无码77777| 亚洲天码视频www蛋播视频| 99视频久久| 五月婷婷六月激情| 天天日天天色| 情色五月天网站| 精品一区二区三区木瓜| VA婷婷| 色噜婷婷| 无码91中文字幕| 色婷婷五月综合在线| 婷婷五月天影视| 久婷久婷| 丁香久久九九99| 色五月综合网| 激情综合网五月天| 五月婷婷性爱| 婷婷中文在线| 五月丁香好婷婷A片网| 色 五月俺去也| 久操婷婷| www.xtbsty.cn.com蜜乳AV| 深情五月天| 婷婷五月天改成什么了| 九九色情网五月天| 日本精品人妻无码77777| 综合五月丁香六月婷婷| 亚洲久久激情| 99精品免费欧美小视频| 开心五月婷| 九九热这里有精品23| 在线观看中文字幕亚洲| 六月丁香综合| 综合天天综合| 久久五月婷| 男人的天堂五月丁香| 亚洲人成网站999综合| 69精品人人人人| 婷婷九月| 综合网啪| 99热e| 国产黄色大片| 色色草97| 97在线日本| 成人在线观看精品| 天海翼中文字幕高| 久热视频97AV在线观看| 中文字幕在线视频播放| 亚洲另类毛片| 婷婷伊人综合中文字幕| 激情网五夜婷婷| 久久精品爱爱| 99热这里有精品24| 色噜噜狠狠插综合| 日韩欧美成人片| 天天操中文字幕| 能看的av| 色婷婷丁香五月| 五月天.com| 色色色综合| 9九热视频| 亭亭五月丁香综合欧美| 色婷婷婷综合五月天| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 激情五月婷婷| 丁香六月高清视频| 久热这里只有精品6| 丁香婷婷情色五月天| 另类小说色婷婷| 91黄操| 色99在线视频| 国产精品99久久久久久久女警| 被强行糟蹋的女人A片| 玖玖婷婷免费| AV在线资源| 蜜臀av无码久久久久久久久| 日日夜夜青青草| 伊人久久五月天| 五月婷婷综合色啪首页| 色婷婷操逼| 久久性爱视频免费| 色婷狠狠| 精品国产一区二区三区四区阿崩 | 婷婷成人综合五月| 五月丁香成人| 国内自拍97在线| 丁香五月天堂网AV| 五月婷婷成人网首页| 色5月婷婷| www..999热久| 色婷丁香91| 91九色欧美| 99久久精彩视频。| 六月丁香激情| 六月五月天婷婷涩播在线| 五月天久久激情| 久久久中文| 色狠狠色狠狠| 丁香五月激情婷婷视频| 激情五月婷婷丁香| 成人在线二区| 精品久热| 免费啪啪亚州视频| 99久久婷婷综合| 亚洲网视屏| 激情丁香五月天图片| 婷婷六月激情| 日韩欧美老妇性视频91久久久| 色婷婷在线视频久| 婷婷五月天久久| 任你搞在线观看视频| 精品99这里有| 九九热只有精品| 色婷婷综合久久| 操99| 9l视频自拍9l九色9l成人| 丁香五月伊人| 香蕉婷婷| 97碰啪啪| 色欲五月婷婷| 久久激情天堂| 日韩三级视频一区二区| 色宗合,宗合网| 999激情视频| 丁香五月天91| 婷婷亚洲丁香五月| 九月色婷婷| 亚洲综合网 665566| 色婷婷狠狠| 五月婷婷亚洲天堂97色婷婷| 天天爽天天透天天爱| 国产亚洲色婷婷久久99精品91| 久久久婷婷五月亚洲97号色| 激情五月天偷拍综合网| 五月天之色情综合网| 26uuuu精品一区二区| 久久激情网| 色99视频| 丁香五月欧美| 欧洲婷婷五月天| 啪啪综合| 看片视频在线免费日产在线看| 欧美日韩中国| 日日日日操| 久久久99精品免费观看| 亚洲AAAA网| 超碰v| 99色区| www.超碰| 日日干综合| 久久xx| 丁香婷婷免费| 亚洲亚洲人成综合网络| 久久这里有精品视频在线免费观看| 爽tv | 色色啊| 色色热| 久久综合中文| 婷婷五月天成人网| 丁香五月婷在线观看| 婷婷碰碰| 综合XX网| 久久人妻久久| 99精品在线| 99久久9| 嫩草AV久久伊人妇女超级A| 五月丁香色综合| 五月色无码| 黄色片久久| www.操逼comm| 婷婷五月丁香A∨| 亚洲午夜一区二区| 深爱女色婷婷丁香五月亚洲图区| 五月久久丁香| 人人综合久| 久久66er久久| 色色999三级片| 天天舔天天操| 热九九精品| 成人综合网站| 婷婷五月丁香超碰| 亚州视频九九99| 久久久噜噜噜操操操| 91久久五月天| 综合深爱五月| 精品久热| 99re久热| 99re久久| 丁香婷婷九月| 五月丁香花伦理电影| 91大神在线免费看视频全集男男一起操| 91丨九色丨熟女|老版| 天天人人综合| 97超碰欧美中文字幕| 99精色| 久久成人天| 99ri精品在线| 2050人人操免费工开爱 | 青青草原亚洲天堂| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | \\五月天婷婷激情| 黄网免费看| 欧美色片中文字幕久久久久| 深爱激情综合网| 久久久久思思热| 丁香六月婷婷| 婷婷大乡焦噜噜| 日日影院 | 天堂A∨在线| 婷婷五月天免费视频| 婷婷五月综合色中文字幕| 麻豆AV一区二区三区| 99热免费| 欧美黄色AA片哗啦啦啦| 深爱激情网噜噜色| 综合久色五月| 这里只有精品日韩| 97久久久久| 5月丁香六月婷婷| www.99久| 综合激情在线视频| 99人妻碰碰碰久久久久| 1024成人免费看| 五月天综合网| 天天射影院| 色色五月天丁香婷婷| 五月草影视| 婷婷激情五月天色| 精品一区二区三区四区五区六区介绍 | 五月色无码| 嫩草视频在线观看| 色婷久九| 久久婷婷五月天激情| 操逼亚洲天堂| 色婷插| 国产在线aaa片一区二区99| 夜夜 操无码| 色欲五月婷婷| 婷色五月天| 女人天堂AV| 99热官网精品在线| 99视频免费播放 | 欧美VA在线观看| 99色1| 成人欧美一区二区三区在线观看| 99热这里只有精品在线免费| 欧洲激情五月天婷婷| 熟女激情网| 99精品国产热久久91色欲| 色婷婷先锋| 久人操| 日本久久人| 九月婷婷综合网| 亚洲视频1区| 卡视频1区2区| 色99日韩| 成人超碰AV| xx色综合| 丁香六月婷婷综合在线| 久久婷婷五月| 色婷| 色噜噜狠狠色综合日日| 蜜桃成语时李时珍 免费| 中文字幕按摩做爰| 精品婷婷丁香五| 996黄色片| 色婷婷在线影院| 97色婷婷在线观看| 欧美噜噜久久久XXX| 99热99在线| 99久久久| 久久久久久婷| 日韩在线9| 思思热天天看| 日日夜夜噜噜爽爽| 综合网啪| 色色五月婷| 欧美成人AAA片一区国产精品| 高清一区二区三区日本久| 色五月婷婷7777| 色婷婷狠狠18yy| 婷婷九月在线| 这里只精品| 五月天久久丁香| a久久| 婷婷五月综合网| 欧美综合激情| 综合色色婷婷| 婷婷五亚洲| 婷婷丁香激情综合色情| 狠狠精品干练久久久无码中文字幕| 国产毛片操B| 9久久精品视频| 丁香五月天婷婷在线视频| 六月丁丁香| 不卡在线中文字幕无| 91九色PORNY中文啦| 成人国产综合| 涩婷婷五月天| 99久久婷婷国产综合精品草原| 玖玖99婷婷| 99在线视频精品| 色的色综合| 综合XX网| 激情久久伊人| 久久综合99| 亚洲色模骚货| 办公室少妇激情呻吟A片在线观看| 婷婷伊人綜合| 天天爽曰日爽| av色婷婷| 日本高清不卡免费一区二区三区| 99热思思在线观看| AV在线免费播放| 在线精品97| 淫视馆aV二区一区| 久久综合首页| 不卡影院午夜理论片| 久久激情综合| 91日日日| 99色色网| 亚洲成人在线观看网址| 五月天欧美 另类小说| 亚洲婷婷91丁香| 欧美婷婷色五月网| 色五月婷婷婷婷| 丁香五月av| www.综合久久.com| 天天天久久人人人合| 天天天天干| 日日噜噜夜夜狠狠久久丁香六月| 日熟女| 婷婷六月香| 婷婷丁香久久五月综合| 九九热这里只有精品6| 性爱人人网| www.26uuu.com亚洲电影| 99re在线观看| 丁香六月婷婷久久综合八月| 日韩成人电影AV| 婷婷色五月开心五月| 一级性爱视频| 亚洲AV电影美洲AV电影| 婷婷五月激情视频| 欧美日韩国产成人在线| 婷婷五点亚洲| 五月丁香天堂| 丁香六月激情国产| 99碰视频| 久久精品系列| 婷婷五月丁香综合激情| 色日本综合| 97热久久五月婷婷| 人人人操| 色综合区| 久热91| 欧美色九| AA丁香综合激情| 久久激情网| 99精品免费视频| 丁香五月婷婷激情完整版| 97欧美在线| 激情亚洲网| 婷婷色丁香五月| 婷婷久久色| 五月天天综合| 日本精品人妻无码77777| yellow视频在线观看91| 五月丁香六月婷婷在线播放| 91肏| 色欲婷婷五月天| 亚洲网站999| 超碰精品在线| 香蕉婷婷色五月| 精品夜夜澡人妻无码AV| 狠色狠色综合久久| 亚洲色图81p| www.色五月.com| 日本三级大片| 偷拍丁香九月激情| 免费视频99| caop在线| 婷色五月| 蜜乳.comcom| 国产AV一区二区三区最新精品| 5月激情天| 精国产品一区二区三区A片| 久久99热 这里有精品| 久久99大| 国产 亚洲 在线| WWW夜夜| 丁香五月天AV在线 | 丁香五月天亚洲视频| 人妻AV在线观看| 九九色精品| 人人操人人爱丁香五月| 色婷婷综合久久久久| 久久精品一区二区三区四区| 色偷偷综合| 色狠狠五月天| 91久久国产综合久久| 色五月激情婷婷| 天天干天天干天天干天天干天天干天天干天天 | 97丁香婷婷| 国产精品久久久久久喷浆| jizzdr| 色婷丁香五月| 久大香蕉| 91九九九九九九| 操碰99| 婷婷中文字暮| 99视频精品视频| 日本在线视频看se99| 96丁香六月婷婷蜜桃综合久久| 婷婷色五月情| 婷婷丁香色五月亚洲| 激情婷婷。| 99久久9| WWW.17C亚洲精品| 天天操天天操| 色色婷婷五月天| 久久久九九九 99| 99精品偷自拍| 五月天婷婷基地| 激情五月天婷婷在线网址发给我| 26uuuavcom| 日本三级中国三级99人妇网站| 五月婷婷9| 日本不卡高字幕在线2019| 五月婷婷偷拍| 天天干天天干天天操| www.com操| 最新日本A片| 久久99精品久久久久子伦| 日本久久色| 国内外色色色色色成人视频| 久九色| 99色在线| 激情五月小说婷婷| 激情五月婷婷老师| 色五月综合网| 国产探花AV在线| 色综合色综合色综合高潮| 综合玖玖性爱免费视频| 婷婷五月天堂| 九九九日本熟女| 99噜噜| 色婷婷色综合激情91| 色综合99无码| 美女久久婷婷| 五月婷婷黄色网址| www。久久久久一b。Cc| 国产精品激情AV久久久青桔| 日本天天色| 婷婷婷婷婷婷婷五月丁香| 日本不卡中文字幕| 中文字幕在线免费观看视频| 色五月综合网| 婷婷色婷婷| 伊人久久婷婷| 免费看欧美成人A片无码| 色五月婷婷五月天| 亚洲综合五月天| www,av好吊操| 婷婷五月在线播放| www.99热在线| 99ri在线| 五月丁香综合| 噼里啪啦完整版中文在线观看| 婷婷五月天激情小说| 久久精品国产一区二区三区四区| 四虎国产精品永久在线国在线| 激情五月天综合网| 99re欧美精品| 激情骚五月| 91色在线| 亚洲成人网无码| 日韩黄黄| 婷婷五月天激情丁香| 婷婷五月激情视频在线| 五月天成人在线视频网站| 色欲五月婷婷| 色色国产| 午夜微拍福利| 99热免费精品| 婷婷欧美色| 天天爽夜夜爽夜爽精品| 天天草比天天爽| 97婷婷丁香| 深爱综合网| 牛色色碰| 九九青草热| 婷婷五月四狠狠| xxx日本东京热| 久久精热| 久久久激情| 五月色情精品| 丁香九月久久| 婷婷色日本| 天天天天干| 狠狠干婷婷| 超级碰碰碰久久网站| 久青操| 亚洲综合视频一下| pom538精品视频| 最近中文字幕大全免费版在线 | 在线另类视频| 日本欧美成人片AAAA| 天色综合网| 色色影院aaaav| 亚洲激情婷婷| 丁香色色网| 丁香社92视频| 激情99。| 五月伊人网| 波多野结衣不卡AV| 婷婷五月丁香综合亚洲 | 久久这里只有精品16| 日韩在线视频网站| 伊人丁香五月天丁香在线婷| 丁香五月最新网址| 夜夜操夜夜姧| 五月丁香婷婷啪啪| 五月婷婷色色网址| 婷婷五月丁香婷婷| 丁香五月AV| AV在线不卡播放| 久久婷婷激情| 99在线免费观看| 性生生活大片又黄又| 久久久久8888| 天天干天天色综合| 99网| 六月丁香婷| 五月丁香成人小说| 五月婷护士| 色亭亭五月天网扯| 综合色色色| 操逼三区| 久久六月综合| 色婷婷精品视频在线播放| 日本色婷婷综合| 久久久久9| 热99久| 亚洲情欲| 精品视频网| 能看的av片| 丁香成人五月天| 91精品91久久久中77777久久玖玖九九 | 中文字幕欧美日韩VA免费视频| www98日本小时间到了| 婷婷五月天激情网站| 丁香六月在线综合| 五月丁香久久综合精品| 欧美激情综合| 五月网激情| 五月丁香色情| 99视频精品| 国产操碰| 一逼色综合| 婷婷五月天黄色| 婷婷久久影院| 亚洲激情久久| 国产精品成人网站| 亭亭五月天黑人2014| 婷色天堂| 婷婷无码视频| 人妻Av在线| 久久六月天| 色五月综合97| 99热热这里只精品996小说| 丁香六月激情综合网| 综合激情视频| 97色啪| 婷婷激情性爱| 狠狠色综合网| 婷婷五月天激情小说| 激情小说五月丁香在线视频观看视频| 色五月综合| ,99视频久久| 国外亚洲成AV人片在线观看| 狠狠色 综合色区| 一级黄色片看看| 久久精品亚洲一级牲爱综合| 9色在线视频精品观看| 丁香五月天天高清在线| 怡红院91a√| 五月天婷婷激情在线色图| 天天干天天干天天干天天干天天干| 99啪在线| 五月丁香狠狠爱| 五月伊人综合| 色综合视频在线| 思思热99热| 亚洲综合1024| 国产SUV精品一区二区6| 开心五月激情婷婷| 九月婷婷激情| 色色色综合网| 亚洲亚洲永久无码777777| 这里只有精品9| 99亚洲精品视频| 日日天天干| 久久99热 这里有精品| 亚洲色图啪啪| 99热精品在线| 国产婷婷五月中文字幕高清| 99热爆在线| 亚洲婷婷五月| 色色色色色色色综合| 国产人人操| 久久久99视频| 婷婷深爱色五月| 久久99jiu9| 激情五月激情综合网| 99国产这里只有精品| 国产精品操| 性无码专区无码| 99re热视频这里只精品5| 久久久ww| 艹B高清无码| 国产免费一区二区三区三州老师F1F1.CC| 丁香五月色情| 激情国产五月| 久99视频| 五月天久久网站| 九九热99re8热免费观看| 新激情五月天| 婷婷五月情| 色色综合视频| 五月伊人综合| 67194中文字幕| 午夜性做爰电影| 丁香五月六月婷婷综合| 97婷婷丁香五月| 色综合久久综合中文综合网| av首页在线| 丁香六月综合| 极品人妻VideOssS人妻| 米奇激情婷婷| 99在线69| 五月丁了香蕉综合| 九九9久九9国产视频| 99热网站| 日日干日日| 五月天堂在线| 婷婷五月天激情文学小说| 97干在线看| 久久久婷丁香五月| 五月天色图| 综合色色婷婷| 色婷五月天网站| 婷婷伊人綜合中文字幕小说| 亚洲综合另类| 日韩成人综合| 五月丁香在线观看国产| 色5月婷婷| 97人人射| 五月天丁香综合| 五月成人网站| 亚洲精品激情| 99综合一区| 偷拍视频五月天| 99热在线免费观看精品| 丁香五月天导航| 综合久久影院| 中文字幕,综合,91| 停停综合色色| 丁香97综合| 91a片爽| 婷婷五月丁香青青草在线| XX色综合| 99热在线观看| 六月婷婷五月丁香| 伊人久久婷婷| www.99色| 79精品视频在线观看,| 色婷婷综合网站| 91碰| 久久99网站| 五月亭亭六月天| 九九色热| www.婷婷.com| 激情六月婷婷| 亚洲色五月| 婷婷色导航| 久久五月视频| 精品一二三区久久AAA片| 九九综合精品| 久久婷婷五月天| 人人爱操| 亚洲第一成人无码A片| 日韩一级一片内射视频4K| 人妻日日日| 拍色综合| 骚五月婷婷| 久久婷婷啪啪视频| 激情深爱五月婷婷| 色五月在线| 亚洲十月婷婷综合| 色色色色色色色色色色色色色色,网站| 夜丁香五月婷婷| 狠狠干五月天| 精品久久久人妻| 婷婷五月天成人网| 91日在线视频| 91综合在线视频| 色情婷婷。| 久久九九玖玖| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 青青草a在线| 五月丁香激情综合网官网| 丁香婷婷五月综合影院| 色婷婷五月天激情在线观看| www色五月| 亚洲人妻av| 久久婷婷免费| 99视频在线观看网址| 亚洲1区| 婷婷五月天 偷拍| 精品无码99| 丁香色婷婷| 婷婷综合久久| 欧美大片免费观看| 久热婷婷在线视频| 啪啪综合网| 丁香五月第四色88| 狠狠五月激情丁香六月| 久99视频| 99亚洲精品综合在线| 婷婷五月天美女21p| 99在线69| 日本一级淫| 2022人人操人人看| renrencaoni| 天天婷婷| 这里只有精品视频在线| 久久九九婷婷| 蜜乳.comcom| 无码区婷婷五月花开| 色色99| 久久五月天丁香花| 中文网AV| 99精品在线| 欧美色男人网站| 99超级碰碰| 五月熟妇婷婷久久| 激情五月天综合网| 久久婷婷五月天大香蕉| 99操视频| 九九久热| 91碰碰碰| 欧美天堂久久| 久久这里有精品视频| 五月天婷婷激情| 九九综合网色全集| 五月丁香激情在线| 播播网色播播| 91岛国片| 中文字幕 久久9999| 五月丁香激情四射| 人人操9| 99精品这里只有免费视频| 五月婷婷久久大香蕉| 五月丁香亭亭激情操逼网| 都市激情久久| 久草A片| 欧美婷婷精品激| 人人舔天天| 五月天激情婷婷| 色热久| 色婷婷成人五月| 亚洲宗合激情| 深爱激情网五月| 人碰91| 亚洲AV成人无码久久精品老人法拉利| 久久久久人妻| 伊人99热| 久操激情| 影音先锋男人资源站一区二区| 日日激情网| 亚洲中文字幕网| 婷婷久久五月丁香| 欧美色97| 金品在线视频99| 99热精品中文字幕| 99ri精品在线观看| 激情小说五月天中文字幕| 99视频在线精品| 丁香婷婷综合激情五月色| 丁香六月婷婷一区二区三区| 六月婷综合| 久热这里只有精品视频6| 欧美精品XXXXBBBB| 激情丁香婷婷五月天| 一起草av| 久久五月丁香婷婷| 午夜一区| 婷婷伊人中文字幕| 五月婷婷片| 久久久久久久久久久久久久久久久精典| 丁香六月成人网| 色色色五月天婷婷| 五月天婷婷成人资源站| WwW色婷婷| 永久AⅤ1| wwww.色婷婷| 99思思热只有在这里看| 无遮挡国产高潮视频免费观看 | 啪啪激情网| 五月婷在线| 激情五月婷婷五月| 狠狠综合| 91碰碰| 国产丁香五月天婷婷| 欧美性生交A片免费看| 激情综合网,婷婷五月天| 五月天色色无码| 久草xx性爱视频| 操比激情五月| 97热在线精品| 色五月综合激情| 99热综合| 六月天丁婷婷| 日韩无码乱轮| 婷婷五月天亚洲| 五月丁香 啪啪| 色婷婷电影网| 天天天天天天天操| 激情五月丁香色色去久久| 婷婷五月激情欧美| 五月天婷婷激情网| 亚洲色无码A片一区二区麻豆| 五月天婷网| 亚洲国产黄色电影| 日本视频99| 一夜福利不卡| 亚洲9久久精品| 激情亚洲婷婷| 九九热九九热精品| 97人碰人操| 停停五月色宗合| 日本99视频| 牛色色碰| 这里只有精品视频| 丁香六月AV| 婷婷五月丁香青青草在线| 狠狠五月天| 热九九在线| 综合色综合| 182.t午在线观看| 婷婷月综合| 国产精品-第3页-91JQ就要激情网91JQ5.JQJQ926.XYZ | 激情五月激情综合网一级丸片| 丁香五月桃花在线激情综合| 中文AV在线播放| 五月色婷婷AV| 婷婷情色五月天| 亚洲第一成人无码A片| 182TV大香蕉| 26uuu亚洲色| 久久婷婷五月天激情四射| 国产偷人爽久久久久久老妇APP| 可以看的AV| 高清无码 一区 二区 三区| 色色婷婷婷丁香五月天| 亚洲操操| 玖玖五月丁香| 国产精品久久久60086| 97精品欧美91久久久久久久| 日日夜夜九九| 丁香五月婷婷在线| 六月婷婷色综合| 丁香成人色情五月天| 人妻乱码久久久| 五月激情视频| A在线观看| 色色热日| 影音 五月 婷婷 久久| 丁香五月综合| 五月激情偷拍| 亚韩在线视频| 人人摸人人| 26uuu欧美日本| 五月色俺婷婷| 日韩抽插操逼| 日韩久久视频| 9久久精品视频| 五月天婷婷综合色| 天天干电影| 99九九精品视频| 深爱婷婷丁香五月激情| 丁香五月综合图片在线观看| 色99在线视频| 色135综合网| 人人摸人人干| 久久婷五月婷| 天天日天天插| 色深爱五月| 人妻精品久久久久久久| 一个色的综合| 国产VA播放| 亚洲成人高清在线| 久久婷五月影院| 色欧美一级| 成人综合网站| 国产成人网| 这里只有精品视频在线| 久久99视频| 婷婷中文无码| 天天日天天干天天插天天射| sewuyuejiqingwang| 狠狠色丁香综合| 66精品国产成人| www超碰| 91九色国产| 亚洲天堂热| 婷婷爱爱蜜臀天天操| 国产性爱一级| 九色无码| 色噜噜狠狠色综合成人网| 欧美图片丁香五月天| 大香蕉狼人久久| 婷婷丁香黄色| 亚洲免费电影2| 色婷婷五月成人网| 精品爆操| www.色婷婷.com| 99久久婷婷五月综合| 日韩AV片| 五月天久久网站| 超碰国产AV| 99九九综合久久九九| 丁香五月香蕉| 婷婷午夜天| 天天爽夜夜操| 精品一二三区久久AAA片| 亚洲字幕AV一区二区三区四区| 成人超碰网| 99精品丰满| 九九超日本| 综合激情在线| 99re这里只有精品99| 国产伊人五月天| 六月婷婷私欲| 欧美成人A片AAA片在线播放| 天天婷婷综合亚洲亚洲| 激情婷婷久久| www.五月天| 欧美交换配乱吟粗大25P| 国产精品涩涩涩视频网站| 婷婷色网址| 色婷久| 婷婷久久久| 插少妇综合网| 狠狠色综合五月| 女人被男人吃奶到高潮| 色色五月天激情| 色噜噜狠狠色综无码久久合欧美| 2025超碰| 超碰国产在线观看| 久久丁香九| 亚洲另类电影| 久久有码| 日日干夜夜干| 色婷婷基地| 欧美一级a | 婷婷五月天777| 婷婷五月六月丁香| 国产精品美女久久久久AV超清 | 色9999日韩国产| 丁香五月天综合网| 婷婷五月色| 色丁香五月婷婷综合久久| 久久中文人妻系列| 99精品在线观看视频| 大地9中文在线观看免费高清| 欧美日韩五月婷婷| 色五月在线| 色婷| 亚洲图片 丁香婷婷| 天天人人综合| 九九无码| 99久久九九视频| 欧美成人精品三区综合A片| 色播五月丁香| 色射7856五月天激情四射| 色的色综合| 色色激情| 婷婷五月欧美| 五月永久激情| 久久久婷婷| 午夜av网| 狠狠五月天婷婷激情网。| 五月婷婷五月天| 4399欧美另类视频| 欧美久久婷婷| 婷婷六月天| 97人人操人人| 激情五月天婷婷在线网址发给我| 少妇出轨做爰高潮A片| 91蜜桃婷婷狠狠久久综合9色| 亚洲精品色| 极品嫩草| 色插综合网| 色啪网| 99在线热| pom538精品视频| 激情五月婷婷她| 一级操逼内射在线视频| 中文字幕免费高清电视剧| 五月天激情小说婷婷| 97操操操| 九九人人精品| 国产午夜精品一区二区| 亚洲婷婷丁香五月| 99re热久久| 天天射网站| 婷婷色香六月综合激情| 色色无码| 欧美在线骚货| 六月婷欧美| 99精在线| 丁香婷婷久久五月天| 色久综合天天做视频| 国产午夜精品一区二区三区四区| 五月丁香六月色婷婷综合五月天| av在线资源| VA色婷婷| 丁香五月婷婷基地| 中文字幕在线免费观看视频| 婷婷久久五月| 超碰99在线| 操人无码|