diff --git a/example/qml-Qt6/page/T_Http.qml b/example/qml-Qt6/page/T_Http.qml index 4c1d03a0..19ae6d9e 100644 --- a/example/qml-Qt6/page/T_Http.qml +++ b/example/qml-Qt6/page/T_Http.qml @@ -10,14 +10,57 @@ import "qrc:///example/qml/component" FluContentPage{ title:"Http" + property string cacheDirPath: FluTools.getApplicationDirPath() + "/cache/http" FluHttp{ id:http } + FluHttp{ + id:http_cache_ifnonecacherequest + cacheMode:FluHttpType.IfNoneCacheRequest + cacheDir:cacheDirPath + } + + FluHttp{ + id:http_cache_requestfailedreadcache + cacheMode:FluHttpType.RequestFailedReadCache + cacheDir:cacheDirPath + } + + FluHttp{ + id:http_cache_firstcachethenrequest + cacheMode:FluHttpType.FirstCacheThenRequest + cacheDir:cacheDirPath + } + + HttpCallable{ + id:callable + onStart: { + showLoading() + } + onFinish: { + hideLoading() + } + onError: + (status,errorString,result)=>{ + console.debug(status+";"+errorString+";"+result) + } + onSuccess: + (result)=>{ + text_info.text = result + console.debug(result) + } + onCache: + (result)=>{ + text_info.text = result + console.debug(result) + } + } + Flickable{ id:layout_flick - width: 160 + width: 200 clip: true anchors{ top: parent.top @@ -36,24 +79,6 @@ FluContentPage{ implicitHeight: 36 text: "Get请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onCache = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } http.get("https://httpbingo.org/get",callable) } } @@ -62,24 +87,6 @@ FluContentPage{ implicitHeight: 36 text: "Post表单请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onCache = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = {} param.custname = "朱子楚" param.custtel = "1234567890" @@ -92,24 +99,6 @@ FluContentPage{ implicitHeight: 36 text: "Post Json请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onCache = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = {} param.custname = "朱子楚" param.custtel = "1234567890" @@ -122,24 +111,6 @@ FluContentPage{ implicitHeight: 36 text: "Post String请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onCache = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = "我命由我不由天" http.postString("https://httpbingo.org/post",callable,param) } @@ -162,9 +133,86 @@ FluContentPage{ file_dialog.open() } } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "FirstCacheThenRequest缓存" + onClicked: { + var param = {} + param.cacheMode = "FirstCacheThenRequest" + http_cache_firstcachethenrequest.post("https://httpbingo.org/post",callable,param) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "RequestFailedReadCache缓存" + onClicked: { + var param = {} + param.cacheMode = "RequestFailedReadCache" + http_cache_requestfailedreadcache.post("https://httpbingo.org/post",callable,param) + } + } + + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "IfNoneCacheRequest缓存" + onClicked: { + var param = {} + param.cacheMode = "IfNoneCacheRequest" + http_cache_ifnonecacherequest.post("https://httpbingo.org/post",callable,param) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "删除缓存" + onClicked: { + console.debug(FluTools.removeDir(cacheDirPath)) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "清空右边数据" + onClicked: { + text_info.text = "" + } + } } } + HttpCallable{ + id:callable_upload + onStart: { + btn_upload.disabled = true + } + onFinish: { + btn_upload.disabled = false + btn_upload.text = "上传文件" + layout_upload_file_size.visible = false + text_upload_file_size.text = "" + } + onError: + (status,errorString,result)=>{ + text_info.text = result + console.debug(result) + } + onSuccess: + (result)=>{ + text_info.text = result + } + onUploadProgress: + (sent,total)=>{ + var locale = Qt.locale() + var precent = (sent/total * 100).toFixed(0) + "%" + btn_upload.text = "上传中..."+precent + text_upload_file_size.text = "%1/%2".arg(locale.formattedDataSize(sent)).arg(locale.formattedDataSize(total)) + layout_upload_file_size.visible = true + } + } + FileDialog { id: file_dialog onAccepted: { @@ -175,65 +223,46 @@ FluContentPage{ var filePath = FluTools.toLocalPath(fileUrl) param[fileName] = filePath } - console.debug(JSON.stringify(param)) - var callable = {} - callable.onStart = function(){ - btn_upload.disabled = true - } - callable.onFinish = function(){ - btn_upload.disabled = false - btn_upload.text = "上传文件" - layout_upload_file_size.visible = false - text_upload_file_size.text = "" - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString,result){ - text_info.text = result - console.debug(result) - } - callable.onUploadProgress = function(sent,total){ - var locale = Qt.locale() - var precent = (sent/total * 100).toFixed(0) + "%" - btn_upload.text = "上传中..."+precent - text_upload_file_size.text = "%1/%2".arg(locale.formattedDataSize(sent)).arg(locale.formattedDataSize(total)) - layout_upload_file_size.visible = true - } - http.upload("https://httpbingo.org/post",callable,param) + http.upload("https://httpbingo.org/post",callable_upload,param) } } - FolderDialog { - id: folder_dialog - currentFolder: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] - onAccepted: { - var callable = {} - callable.onStart = function(){ - btn_download.disabled = true + HttpCallable{ + id:callable_download + onStart: { + btn_download.disabled = true + } + onFinish: { + btn_download.disabled = false + btn_download.text = "下载文件" + layout_download_file_size.visible = false + text_download_file_size.text = "" + } + onError: + (status,errorString,result)=>{ + showError(errorString) + console.debug(status+";"+errorString+";"+result) } - callable.onFinish = function(){ - btn_download.disabled = false - btn_download.text = "下载文件" - layout_download_file_size.visible = false - text_download_file_size.text = "" - } - callable.onSuccess = function(result){ + onSuccess: + (result)=>{ showSuccess(result) } - callable.onError = function(status,errorString){ - showError(errorString) - } - callable.onDownloadProgress = function(recv,total){ + onDownloadProgress: + (recv,total)=>{ var locale = Qt.locale() var precent = (recv/total * 100).toFixed(0) + "%" btn_download.text = "下载中..."+precent text_download_file_size.text = "%1/%2".arg(locale.formattedDataSize(recv)).arg(locale.formattedDataSize(total)) layout_download_file_size.visible = true } + } + + FolderDialog { + id: folder_dialog + currentFolder: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] + onAccepted: { var path = FluTools.toLocalPath(currentFolder)+ "/big_buck_bunny.mp4" - http.download("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",callable,path) + http.download("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",callable_download,path) } } @@ -277,7 +306,6 @@ FluContentPage{ } } - FluRectangle{ id:layout_upload_file_size radius: [4,4,4,4] diff --git a/example/qml-Qt6/window/MainWindow.qml b/example/qml-Qt6/window/MainWindow.qml index 89c6a9c1..a0159a4c 100644 --- a/example/qml-Qt6/window/MainWindow.qml +++ b/example/qml-Qt6/window/MainWindow.qml @@ -309,27 +309,33 @@ CustomWindow { } } - function checkUpdate(){ - var callable = {} - callable.onStart = function(){ + + HttpCallable{ + id:callable + onStart: { console.debug("satrt check update...") } - callable.onFinish = function(){ + onFinish: { console.debug("check update finish") } - callable.onSuccess = function(result){ - var data = JSON.parse(result) - console.debug("current version "+appInfo.version) - console.debug("new version "+data.tag_name) - if(data.tag_name !== appInfo.version){ - dialog_update.newVerson = data.tag_name - dialog_update.body = data.body - dialog_update.open() + onSuccess: + (result)=>{ + var data = JSON.parse(result) + console.debug("current version "+appInfo.version) + console.debug("new version "+data.tag_name) + if(data.tag_name !== appInfo.version){ + dialog_update.newVerson = data.tag_name + dialog_update.body = data.body + dialog_update.open() + } } - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } + onError: + (status,errorString)=>{ + console.debug(status+";"+errorString) + } + } + + function checkUpdate(){ http.get("https://api.github.com/repos/zhuzichu520/FluentUI/releases/latest",callable) } diff --git a/example/qml/page/T_Http.qml b/example/qml/page/T_Http.qml index 0a1c5e66..88ce5eb7 100644 --- a/example/qml/page/T_Http.qml +++ b/example/qml/page/T_Http.qml @@ -11,14 +11,57 @@ import "../component" FluContentPage{ title:"Http" + property string cacheDirPath: FluTools.getApplicationDirPath() + "/cache/http" FluHttp{ id:http } + FluHttp{ + id:http_cache_ifnonecacherequest + cacheMode:FluHttpType.IfNoneCacheRequest + cacheDir:cacheDirPath + } + + FluHttp{ + id:http_cache_requestfailedreadcache + cacheMode:FluHttpType.RequestFailedReadCache + cacheDir:cacheDirPath + } + + FluHttp{ + id:http_cache_firstcachethenrequest + cacheMode:FluHttpType.FirstCacheThenRequest + cacheDir:cacheDirPath + } + + HttpCallable{ + id:callable + onStart: { + showLoading() + } + onFinish: { + hideLoading() + } + onError: + (status,errorString,result)=>{ + console.debug(status+";"+errorString+";"+result) + } + onSuccess: + (result)=>{ + text_info.text = result + console.debug(result) + } + onCache: + (result)=>{ + text_info.text = result + console.debug(result) + } + } + Flickable{ id:layout_flick - width: 160 + width: 200 clip: true anchors{ top: parent.top @@ -37,20 +80,6 @@ FluContentPage{ implicitHeight: 36 text: "Get请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } http.get("https://httpbingo.org/get",callable) } } @@ -59,20 +88,6 @@ FluContentPage{ implicitHeight: 36 text: "Post表单请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = {} param.custname = "朱子楚" param.custtel = "1234567890" @@ -85,20 +100,6 @@ FluContentPage{ implicitHeight: 36 text: "Post Json请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = {} param.custname = "朱子楚" param.custtel = "1234567890" @@ -111,20 +112,6 @@ FluContentPage{ implicitHeight: 36 text: "Post String请求" onClicked: { - var callable = {} - callable.onStart = function(){ - showLoading() - } - callable.onFinish = function(){ - hideLoading() - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } var param = "我命由我不由天" http.postString("https://httpbingo.org/post",callable,param) } @@ -147,9 +134,86 @@ FluContentPage{ file_dialog.open() } } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "FirstCacheThenRequest缓存" + onClicked: { + var param = {} + param.cacheMode = "FirstCacheThenRequest" + http_cache_firstcachethenrequest.post("https://httpbingo.org/post",callable,param) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "RequestFailedReadCache缓存" + onClicked: { + var param = {} + param.cacheMode = "RequestFailedReadCache" + http_cache_requestfailedreadcache.post("https://httpbingo.org/post",callable,param) + } + } + + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "IfNoneCacheRequest缓存" + onClicked: { + var param = {} + param.cacheMode = "IfNoneCacheRequest" + http_cache_ifnonecacherequest.post("https://httpbingo.org/post",callable,param) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "删除缓存" + onClicked: { + console.debug(FluTools.removeDir(cacheDirPath)) + } + } + FluButton{ + implicitWidth: parent.width + implicitHeight: 36 + text: "清空右边数据" + onClicked: { + text_info.text = "" + } + } } } + HttpCallable{ + id:callable_upload + onStart: { + btn_upload.disabled = true + } + onFinish: { + btn_upload.disabled = false + btn_upload.text = "上传文件" + layout_upload_file_size.visible = false + text_upload_file_size.text = "" + } + onError: + (status,errorString,result)=>{ + text_info.text = result + console.debug(result) + } + onSuccess: + (result)=>{ + text_info.text = result + } + onUploadProgress: + (sent,total)=>{ + var locale = Qt.locale() + var precent = (sent/total * 100).toFixed(0) + "%" + btn_upload.text = "上传中..."+precent + text_upload_file_size.text = "%1/%2".arg(locale.formattedDataSize(sent)).arg(locale.formattedDataSize(total)) + layout_upload_file_size.visible = true + } + } + FileDialog { id: file_dialog onAccepted: { @@ -160,65 +224,46 @@ FluContentPage{ var filePath = FluTools.toLocalPath(fileUrl) param[fileName] = filePath } - console.debug(JSON.stringify(param)) - var callable = {} - callable.onStart = function(){ - btn_upload.disabled = true - } - callable.onFinish = function(){ - btn_upload.disabled = false - btn_upload.text = "上传文件" - layout_upload_file_size.visible = false - text_upload_file_size.text = "" - } - callable.onSuccess = function(result){ - text_info.text = result - console.debug(result) - } - callable.onError = function(status,errorString,result){ - text_info.text = result - console.debug(result) - } - callable.onUploadProgress = function(sent,total){ - var locale = Qt.locale() - var precent = (sent/total * 100).toFixed(0) + "%" - btn_upload.text = "上传中..."+precent - text_upload_file_size.text = "%1/%2".arg(locale.formattedDataSize(sent)).arg(locale.formattedDataSize(total)) - layout_upload_file_size.visible = true - } - http.upload("https://httpbingo.org/post",callable,param) + http.upload("https://httpbingo.org/post",callable_upload,param) } } - FolderDialog { - id: folder_dialog - currentFolder: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] - onAccepted: { - var callable = {} - callable.onStart = function(){ - btn_download.disabled = true + HttpCallable{ + id:callable_download + onStart: { + btn_download.disabled = true + } + onFinish: { + btn_download.disabled = false + btn_download.text = "下载文件" + layout_download_file_size.visible = false + text_download_file_size.text = "" + } + onError: + (status,errorString,result)=>{ + showError(errorString) + console.debug(status+";"+errorString+";"+result) } - callable.onFinish = function(){ - btn_download.disabled = false - btn_download.text = "下载文件" - layout_download_file_size.visible = false - text_download_file_size.text = "" - } - callable.onSuccess = function(result){ + onSuccess: + (result)=>{ showSuccess(result) } - callable.onError = function(status,errorString){ - showError(errorString) - } - callable.onDownloadProgress = function(recv,total){ + onDownloadProgress: + (recv,total)=>{ var locale = Qt.locale() var precent = (recv/total * 100).toFixed(0) + "%" btn_download.text = "下载中..."+precent text_download_file_size.text = "%1/%2".arg(locale.formattedDataSize(recv)).arg(locale.formattedDataSize(total)) layout_download_file_size.visible = true } + } + + FolderDialog { + id: folder_dialog + currentFolder: StandardPaths.standardLocations(StandardPaths.DownloadLocation)[0] + onAccepted: { var path = FluTools.toLocalPath(currentFolder)+ "/big_buck_bunny.mp4" - http.download("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",callable,path) + http.download("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4",callable_download,path) } } @@ -262,7 +307,6 @@ FluContentPage{ } } - FluRectangle{ id:layout_upload_file_size radius: [4,4,4,4] diff --git a/example/qml/window/MainWindow.qml b/example/qml/window/MainWindow.qml index 95831a8b..5db84342 100644 --- a/example/qml/window/MainWindow.qml +++ b/example/qml/window/MainWindow.qml @@ -310,27 +310,32 @@ CustomWindow { } } - function checkUpdate(){ - var callable = {} - callable.onStart = function(){ + HttpCallable{ + id:callable + onStart: { console.debug("satrt check update...") } - callable.onFinish = function(){ + onFinish: { console.debug("check update finish") } - callable.onSuccess = function(result){ - var data = JSON.parse(result) - console.debug("current version "+appInfo.version) - console.debug("new version "+data.tag_name) - if(data.tag_name !== appInfo.version){ - dialog_update.newVerson = data.tag_name - dialog_update.body = data.body - dialog_update.open() + onSuccess: + (result)=>{ + var data = JSON.parse(result) + console.debug("current version "+appInfo.version) + console.debug("new version "+data.tag_name) + if(data.tag_name !== appInfo.version){ + dialog_update.newVerson = data.tag_name + dialog_update.body = data.body + dialog_update.open() + } } - } - callable.onError = function(status,errorString){ - console.debug(status+";"+errorString) - } + onError: + (status,errorString)=>{ + console.debug(status+";"+errorString) + } + } + + function checkUpdate(){ http.get("https://api.github.com/repos/zhuzichu520/FluentUI/releases/latest",callable) } diff --git a/src/FluHttp.cpp b/src/FluHttp.cpp index e8ab346d..e5e5f99d 100644 --- a/src/FluHttp.cpp +++ b/src/FluHttp.cpp @@ -14,6 +14,11 @@ #include "FluApp.h" #include "FluTools.h" +HttpCallable::HttpCallable(QObject *parent) + : QObject{parent} +{ +} + FluHttp::FluHttp(QObject *parent) : QObject{parent} { @@ -39,18 +44,18 @@ void FluHttp::handleReply(QNetworkReply* reply){ _cacheReply.append(reply); } -void FluHttp::post(QString url,QJSValue callable,QMap params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"post"); - QMap data = invokeIntercept(requestMap).toMap(); +void FluHttp::post(QString url,HttpCallable* callable,QMap params,QMap headers){ QThreadPool::globalInstance()->start([=](){ - onStart(callable); + auto requestMap = toRequest(url,params,headers,"post"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); if(_cacheMode == FluHttpType::CacheMode::IfNoneCacheRequest && cacheExists(requestMap)){ - onCache(callable,readCache(requestMap)); - onFinish(callable); + Q_EMIT callable->cache(readCache(requestMap)); + Q_EMIT callable->finish(); return; } if(_cacheMode == FluHttpType::CacheMode::FirstCacheThenRequest){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } for (int i = 0; i < retry(); ++i) { QNetworkAccessManager manager; @@ -85,33 +90,34 @@ void FluHttp::post(QString url,QJSValue callable,QMap params, reply = nullptr; if (isSuccess) { handleCache(requestMap,result); - onSuccess(callable,result); + Q_EMIT callable->success(result); break; }else{ if(i == retry()-1){ if(_cacheMode == FluHttpType::CacheMode::RequestFailedReadCache){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } - onError(callable,status,errorString,result); + Q_EMIT callable->error(status,errorString,result); } } } - onFinish(callable); + Q_EMIT callable->finish(); + // Q_EMIT callable->finish(); }); } -void FluHttp::postString(QString url,QJSValue callable,QString params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"postString"); - QMap data = invokeIntercept(requestMap).toMap(); +void FluHttp::postString(QString url,HttpCallable* callable,QString params,QMap headers){ QThreadPool::globalInstance()->start([=](){ - onStart(callable); + auto requestMap = toRequest(url,params,headers,"postString"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); if(_cacheMode == FluHttpType::CacheMode::IfNoneCacheRequest && cacheExists(requestMap)){ - onCache(callable,readCache(requestMap)); - onFinish(callable); + Q_EMIT callable->cache(readCache(requestMap)); + Q_EMIT callable->finish(); return; } if(_cacheMode == FluHttpType::CacheMode::FirstCacheThenRequest){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } for (int i = 0; i < retry(); ++i) { QNetworkAccessManager manager; @@ -137,33 +143,33 @@ void FluHttp::postString(QString url,QJSValue callable,QString params,QMapsuccess(result); break; }else{ if(i == retry()-1){ if(_cacheMode == FluHttpType::CacheMode::RequestFailedReadCache){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } - onError(callable,status,errorString,result); + Q_EMIT callable->error(status,errorString,result); } } } - onFinish(callable); + Q_EMIT callable->finish(); }); } -void FluHttp::postJson(QString url,QJSValue callable,QMap params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"postJson"); - QMap data = invokeIntercept(requestMap).toMap(); +void FluHttp::postJson(QString url,HttpCallable* callable,QMap params,QMap headers){ QThreadPool::globalInstance()->start([=](){ - onStart(callable); + auto requestMap = toRequest(url,params,headers,"postJson"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); if(_cacheMode == FluHttpType::CacheMode::IfNoneCacheRequest && cacheExists(requestMap)){ - onCache(callable,readCache(requestMap)); - onFinish(callable); + Q_EMIT callable->cache(readCache(requestMap)); + Q_EMIT callable->finish(); return; } if(_cacheMode == FluHttpType::CacheMode::FirstCacheThenRequest){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } for (int i = 0; i < retry(); ++i) { QNetworkAccessManager manager; @@ -189,32 +195,32 @@ void FluHttp::postJson(QString url,QJSValue callable,QMap par reply = nullptr; if (isSuccess) { handleCache(requestMap,result); - onSuccess(callable,result); + Q_EMIT callable->success(result); break; }else{ if(i == retry()-1){ if(_cacheMode == FluHttpType::CacheMode::RequestFailedReadCache){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } - onError(callable,status,errorString,result); + Q_EMIT callable->error(status,errorString,result); } } } - onFinish(callable); + Q_EMIT callable->finish(); }); } -void FluHttp::get(QString url,QJSValue callable,QMap params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"get"); - QMap data = invokeIntercept(requestMap).toMap(); - QThreadPool::globalInstance()->start([=](){ - onStart(callable); +void FluHttp::get(QString url,HttpCallable* callable,QMap params,QMap headers){ + QThreadPool::globalInstance()->start([=](){ + auto requestMap = toRequest(url,params,headers,"get"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); if(_cacheMode == FluHttpType::CacheMode::FirstCacheThenRequest){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } if(_cacheMode == FluHttpType::CacheMode::IfNoneCacheRequest && cacheExists(requestMap)){ - onCache(callable,readCache(requestMap)); - onFinish(callable); + Q_EMIT callable->cache(readCache(requestMap)); + Q_EMIT callable->finish(); return; } for (int i = 0; i < retry(); ++i) { @@ -240,26 +246,26 @@ void FluHttp::get(QString url,QJSValue callable,QMap params,Q reply = nullptr; if (isSuccess) { handleCache(requestMap,result); - onSuccess(callable,result); + Q_EMIT callable->success(result); break; }else{ if(i == retry()-1){ if(_cacheMode == FluHttpType::CacheMode::RequestFailedReadCache){ - onCache(callable,readCache(requestMap)); + Q_EMIT callable->cache(readCache(requestMap)); } - onError(callable,status,errorString,result); + Q_EMIT callable->error(status,errorString,result); } } } - onFinish(callable); + Q_EMIT callable->finish(); }); } -void FluHttp::download(QString url,QJSValue callable,QString filePath,QMap params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"download"); - QMap data = invokeIntercept(requestMap).toMap(); +void FluHttp::download(QString url,HttpCallable* callable,QString filePath,QMap params,QMap headers){ QThreadPool::globalInstance()->start([=](){ - onStart(callable); + auto requestMap = toRequest(url,params,headers,"download"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); QNetworkAccessManager manager; QUrl _url(url); addQueryParam(&_url,data["params"].toMap()); @@ -269,8 +275,8 @@ void FluHttp::download(QString url,QJSValue callable,QString filePath,QMapopen(mode)) { - onError(callable,-1,QString("Url: %1 %2 Non-Writable").arg(request.url().toString(),file->fileName()),""); - onFinish(callable); + Q_EMIT callable->error(-1,QString("Url: %1 %2 Non-Writable").arg(request.url().toString(),file->fileName()),""); + Q_EMIT callable->finish(); return; } QEventLoop loop; @@ -280,27 +286,27 @@ void FluHttp::download(QString url,QJSValue callable,QString filePath,QMap reply = manager.get(request); _cacheReply.append(reply); connect(reply,&QNetworkReply::downloadProgress,this,[=](qint64 bytesReceived, qint64 bytesTotal){ - onDownloadProgress(callable,bytesReceived,bytesTotal); + Q_EMIT callable->downloadProgress(bytesReceived,bytesTotal); }); loop.exec(); if (reply->error() == QNetworkReply::NoError) { file->write(reply->readAll()); - onSuccess(callable,filePath); + Q_EMIT callable->success(filePath); }else{ - onError(callable,reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(),reply->errorString(),""); + Q_EMIT callable->error(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(),reply->errorString(),""); } _cacheReply.removeOne(reply); reply->deleteLater(); reply = nullptr; - onFinish(callable); + Q_EMIT callable->finish(); }); } -void FluHttp::upload(QString url,QJSValue callable,QMap params,QMap headers){ - auto requestMap = toRequest(url,params,headers,"upload"); - QMap data = invokeIntercept(requestMap).toMap(); +void FluHttp::upload(QString url,HttpCallable* callable,QMap params,QMap headers){ QThreadPool::globalInstance()->start([=](){ - onStart(callable); + auto requestMap = toRequest(url,params,headers,"upload"); + QMap data = invokeIntercept(requestMap).toMap(); + Q_EMIT callable->start(); QNetworkAccessManager manager; manager.setTransferTimeout(timeout()); QUrl _url(url); @@ -328,7 +334,7 @@ void FluHttp::upload(QString url,QJSValue callable,QMap param loop.quit(); }); connect(reply,&QNetworkReply::uploadProgress,this,[=](qint64 bytesSent, qint64 bytesTotal){ - onUploadProgress(callable,bytesSent,bytesTotal); + Q_EMIT callable->uploadProgress(bytesSent,bytesTotal); }); loop.exec(); QString result = QString::fromUtf8(reply->readAll()); @@ -339,11 +345,11 @@ void FluHttp::upload(QString url,QJSValue callable,QMap param reply->deleteLater(); reply = nullptr; if (isSuccess) { - onSuccess(callable,result); + Q_EMIT callable->success(result); }else{ - onError(callable,status,errorString,result); + Q_EMIT callable->error(status,errorString,result); } - onFinish(callable); + Q_EMIT callable->finish(); }); } @@ -362,7 +368,7 @@ QVariant FluHttp::invokeIntercept(QMap request){ return request; } QVariant target; - QMetaObject::invokeMethod(FluApp::getInstance()->httpInterceptor(), "onIntercept",Q_RETURN_ARG(QVariant,target),Q_ARG(QVariant, request)); + QMetaObject::invokeMethod(FluApp::getInstance()->httpInterceptor(), "onIntercept",Qt::BlockingQueuedConnection,Q_RETURN_ARG(QVariant,target),Q_ARG(QVariant, request)); return target; } @@ -386,67 +392,6 @@ void FluHttp::addHeaders(QNetworkRequest* request,const QMap& } } -void FluHttp::onStart(const QJSValue& callable){ - MainThread::post([=](){ - QJSValue onStart = callable.property("onStart"); - onStart.call(); - }); -} - -void FluHttp::onFinish(const QJSValue& callable){ - MainThread::post([=](){ - QJSValue onFinish = callable.property("onFinish"); - onFinish.call(); - }); -} - -void FluHttp::onError(const QJSValue& callable,int status,QString errorString,QString result){ - MainThread::post([=](){ - QJSValue onError = callable.property("onError"); - QJSValueList args; - args<(recv); - args<(total); - QJSValue onDownloadProgress = callable.property("onDownloadProgress"); - onDownloadProgress.call(args); - }); -} - -void FluHttp::onUploadProgress(const QJSValue& callable,qint64 sent, qint64 total){ - MainThread::post([=](){ - QJSValueList args; - args<(sent); - args<(total); - QJSValue onUploadProgress = callable.property("onUploadProgress"); - onUploadProgress.call(args); - }); -} - QString FluHttp::readCache(const QMap& request){ auto filePath = getCacheFilePath(request); QString result; diff --git a/src/FluHttp.h b/src/FluHttp.h index 0747aaa4..af19e36f 100644 --- a/src/FluHttp.h +++ b/src/FluHttp.h @@ -6,6 +6,21 @@ #include #include #include "stdafx.h" +#include + +class HttpCallable : public QObject{ + Q_OBJECT + QML_NAMED_ELEMENT(HttpCallable) +public: + explicit HttpCallable(QObject *parent = nullptr); + Q_SIGNAL void start(); + Q_SIGNAL void finish(); + Q_SIGNAL void error(int status,QString errorString,QString result); + Q_SIGNAL void success(QString result); + Q_SIGNAL void cache(QString result); + Q_SIGNAL void downloadProgress(qint64 recv, qint64 total); + Q_SIGNAL void uploadProgress(qint64 recv, qint64 total); +}; class FluHttp : public QObject { @@ -21,13 +36,6 @@ private: void handleReply(QNetworkReply* reply); void addQueryParam(QUrl* url,const QMap& params); void addHeaders(QNetworkRequest* request,const QMap& params); - void onStart(const QJSValue& callable); - void onFinish(const QJSValue& callable); - void onError(const QJSValue& callable,int status,QString errorString,QString result); - void onSuccess(const QJSValue& callable,QString result); - void onCache(const QJSValue& callable,QString result); - void onDownloadProgress(const QJSValue& callable,qint64 recv, qint64 total); - void onUploadProgress(const QJSValue& callable,qint64 recv, qint64 total); void handleCache(QMap request, const QString& result); QString readCache(const QMap& request); bool cacheExists(const QMap& request); @@ -36,12 +44,12 @@ public: explicit FluHttp(QObject *parent = nullptr); ~FluHttp(); //神坑!!! 如果参数使用QVariantMap会有问题,在6.4.3版本中QML一调用就会编译失败。所以改用QMap - Q_INVOKABLE void get(QString url,QJSValue callable,QMap params= {},QMap headers = {}); - Q_INVOKABLE void post(QString url,QJSValue callable,QMap params= {},QMap headers = {}); - Q_INVOKABLE void postString(QString url,QJSValue callable,QString params = "",QMap headers = {}); - Q_INVOKABLE void postJson(QString url,QJSValue callable,QMap params = {},QMap headers = {}); - Q_INVOKABLE void download(QString url,QJSValue callable,QString filePath,QMap params = {},QMap headers = {}); - Q_INVOKABLE void upload(QString url,QJSValue callable,QMap params = {},QMap headers = {}); + Q_INVOKABLE void get(QString url,HttpCallable* callable,QMap params= {},QMap headers = {}); + Q_INVOKABLE void post(QString url,HttpCallable* callable,QMap params= {},QMap headers = {}); + Q_INVOKABLE void postString(QString url,HttpCallable* callable,QString params = "",QMap headers = {}); + Q_INVOKABLE void postJson(QString url,HttpCallable* callable,QMap params = {},QMap headers = {}); + Q_INVOKABLE void download(QString url,HttpCallable* callable,QString filePath,QMap params = {},QMap headers = {}); + Q_INVOKABLE void upload(QString url,HttpCallable* callable,QMap params = {},QMap headers = {}); Q_INVOKABLE void cancel(); private: QList> _cacheReply; diff --git a/src/FluTools.cpp b/src/FluTools.cpp index a09e585c..1067a402 100644 --- a/src/FluTools.cpp +++ b/src/FluTools.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -145,3 +146,7 @@ QString FluTools::fromBase64(QString text) return QByteArray::fromBase64(text.toUtf8()); } +bool FluTools::removeDir(QString dirPath){ + QDir qDir(dirPath); + return qDir.removeRecursively(); +} diff --git a/src/FluTools.h b/src/FluTools.h index bb2a525b..9df087f4 100644 --- a/src/FluTools.h +++ b/src/FluTools.h @@ -149,21 +149,29 @@ public: * @param text * @return */ - QString md5(QString text); + Q_INVOKABLE QString md5(QString text); /** * @brief toBase64 * @param text * @return */ - QString toBase64(QString text); + Q_INVOKABLE QString toBase64(QString text); /** * @brief fromBase64 * @param text * @return */ - QString fromBase64(QString text); + Q_INVOKABLE QString fromBase64(QString text); + + + /** + * @brief removeDir + * @param dirPath + * @return + */ + Q_INVOKABLE bool removeDir(QString dirPath); }; diff --git a/src/fluentuiplugin.cpp b/src/fluentuiplugin.cpp index 013b1b0d..986d62f2 100644 --- a/src/fluentuiplugin.cpp +++ b/src/fluentuiplugin.cpp @@ -38,6 +38,7 @@ void FluentUIPlugin::registerTypes(const char *uri) qmlRegisterType(uri,major,minor,"FluColorSet"); qmlRegisterType(uri,major,minor,"FluHttpInterceptor"); qmlRegisterType(uri,major,minor,"FluHttp"); + qmlRegisterType(uri,major,minor,"HttpCallable"); qmlRegisterUncreatableMetaObject(Fluent_Awesome::staticMetaObject, uri,major,minor,"FluentIcons", "Access to enums & flags only"); qmlRegisterUncreatableMetaObject(FluThemeType::staticMetaObject, uri,major,minor,"FluThemeType", "Access to enums & flags only"); qmlRegisterUncreatableMetaObject(FluPageType::staticMetaObject, uri,major,minor,"FluPageType", "Access to enums & flags only");