uniapp項目實踐封裝通用請求上傳以及下載方法總結(jié)
原理分析
主要是使用uni.request
方法來發(fā)送請求,uni.downloadFile
方法來下載文件,uni.uploadFile
方法來上傳文件。
以下方法存于根目錄下的scripts
文件夾下的http.js
文件中。
方法實現(xiàn)
接下來一一說明如何實現(xiàn)數(shù)據(jù)請求、文件下載以及文件的上傳的方法封裝。
數(shù)據(jù)請求
這個方法要接收一些參數(shù),和現(xiàn)有默認(rèn)參數(shù)合并,然后傳給請求 API,獲取數(shù)據(jù)后使用try...catch
來處理成功和失敗。
這里要引入一些文件,包括請求的域名和地址,以及一些通用方法,就先省略了,接口可以到網(wǎng)上找一下公共的,或者自己使用 node 搭建一個簡易的接口服務(wù)器。
// 網(wǎng)絡(luò)請求 async function request(options) { let isHttp = options.url.indexOf("http") > -1; let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`; let defultOptions = { url, method: options.method || "get", data: options.data || null, timeout: options.timeout || 30000, dataType: options.dataType || "json", header: options.header || { "Content-Type": "application/json", }, sslVerify: options.sslVerify || false, }; let params = { ...options, ...defultOptions }; console.log("請求參數(shù):", params); try { let result = await uni.request(params); if (result.statusCode === 200) { return result.data; } else { return { code: 102, msg: "get_fail", data: { info: result.errMsg, }, }; } return result; } catch (e) { return { code: 101, msg: "get_fail", data: { info: e, }, }; } }
文件下載
這個就和請求一樣,只不過 API 不一樣,看一下內(nèi)容。
// 下載文件 async function download(options) { let isHttp = options.url.indexOf("http") > -1; let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`; let defultOptions = { url, timeout: options.timeout || 30000, header: options.header || {}, filePath: options.filePath, }; let params = { ...options, ...defultOptions }; console.log("下載參數(shù):", params); try { let result = await uni.downloadFile(params); if (result.statusCode === 200) { return result.tempFilePath; } else { return { code: 102, msg: "download_fail", data: { info: result.errMsg, }, }; } return result; } catch (e) { return { code: 101, msg: "download_fail", data: { info: e, }, }; } }
文件上傳
文件上傳同以上一樣,簡單封裝一下。
// 上傳文件 async function upload(options) { let isHttp = options.url.indexOf("http") > -1; let url = isHttp ? options.url : `${urls.baseUrl}${options.url}`; let defultOptions = { url, timeout: options.timeout || 30000, filePath: options.filePath || "", name: options.name || "file", }; let params = { ...options, ...defultOptions }; console.log("上傳參數(shù):", params); try { let result = await uni.uploadFile(params); if (result.statusCode === 200) { return JSON.parse(result.data); } else { return { code: 102, msg: "upload_fail", data: { info: result.errMsg, }, }; } return result; } catch (e) { //TODO handle the exception return { code: 101, msg: "upload_fail", data: { info: e, }, }; } }
寫好以后記得導(dǎo)出方法。
實戰(zhàn)演練
模板內(nèi)容
- 請求內(nèi)容
<view class="list-http"> <button @click="sendReq">發(fā)起請求</button> <text class="list-http-txt">響應(yīng)內(nèi)容:{{ httpInfo.request }}</text> </view>
- 下載內(nèi)容
<!-- 下載圖片 --> <view class="list-http"> <button @click="downloadImg">下載圖片</button> <text class="list-http-txt">響應(yīng)內(nèi)容:</text> <image class="list-http-img" :src="httpInfo.imgUrl" mode="widthFix"></image> </view> <!-- 下載文件 --> <view class="list-http"> <button @click="downloadFile">下載文件</button> <text class="list-http-txt">響應(yīng)內(nèi)容:{{ httpInfo.fileUrl }}</text> </view>
- 上傳內(nèi)容
<!-- 上傳圖片 --> <view class="list-http"> <button @click="uploadImg">上傳圖片</button> <text class="list-http-txt">響應(yīng)內(nèi)容:</text> <image class="list-http-img" :src="httpInfo.uploadImgUrl" mode="widthFix" ></image> </view> <!-- 上傳文件 --> <!-- #ifdef H5 || MP-WEIXIN --> <view class="list-http"> <uni-file-picker ref="files" :auto-upload="false" limit="1" title="最多選擇1個文件" file-mediatype="all" mode="list" @select="fileSelect" @progress="fileProgress" @success="fileSuccess" @fail="fileFail" ></uni-file-picker> <text class="list-http-txt">響應(yīng)內(nèi)容:{{ httpInfo.uploadFileUrl }}</text> </view> <!-- #endif -->
腳本方法
- 定義數(shù)據(jù)
let httpInfo = reactive({ request: null, imgUrl: "", fileUrl: "", uploadImgUrl: "", uploadFileUrl: "", });
- 請求方法
// 請求內(nèi)容 async function sendReq() { let opts = { url: proxy.$apis.urls.food, method: "get", }; let data = await proxy.$http.request(opts); if (data.code == 200) { httpInfo.request = JSON.stringify(data.data.list); } console.log("請求內(nèi)容:", data); }
- 下載圖片
// 下載圖片 async function downloadImg() { let opts = { url: proxy.$apis.urls.img, }; let data = await proxy.$http.download(opts); if (data) { httpInfo.imgUrl = data; } }
- 下載文件
// 下載文件 async function downloadFile() { let opts = { url: proxy.$apis.urls.txt, }; let data = await proxy.$http.download(opts); console.log(data); if (data) { httpInfo.fileUrl = data; } }
- 上傳圖片
// 上傳圖片 async function uploadImg() { uni.chooseImage({ complete(res) { if (res.tempFiles) { let file = res.tempFiles[0]; uploadSet(file.path); } }, }); }
- 上傳文件
// 上傳文件 // 獲取上傳狀態(tài) function fileSelect(e) { console.log("選擇文件:", e); if (e.tempFiles) { let file = e.tempFiles[0]; uploadSet(file.path, "file"); } } // 獲取上傳進(jìn)度 function fileProgress(e) { console.log("上傳進(jìn)度:", e); } // 上傳成功 function fileSuccess(e) { console.log("上傳成功"); } // 上傳失敗 function fileFail(e) { console.log("上傳失?。?, e); }
- 上傳操作
// 上傳操作 async function uploadSet(filePath, type = "img") { let opts = { url: proxy.$apis.urls.upload, filePath, }; let data = await proxy.$http.upload(opts); if (data.code == 200) { httpInfo[type == "img" ? "uploadImgUrl" : "uploadFileUrl"] = data.data.url; httpInfo.fileName = data.data.filename; } else { uni.showToast({ title: data.data.info, icon: "error", }); } }
案例展示
請求方法預(yù)覽
文件下載預(yù)覽
下載圖片
下載文件
文件上傳預(yù)覽
上傳圖片
上傳文件
最后
以上就是封裝通用請求上傳以及下載方法的主要內(nèi)容,更多關(guān)于uniapp封裝請求上傳下載的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
純javascript前端實現(xiàn)base64圖片下載(兼容IE10+)
這篇文章主要介紹了純javascript前端實現(xiàn)base64圖片下載(兼容IE10+),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09js類型轉(zhuǎn)換與引用類型詳解(Boolean_Number_String)
本篇文章主要是對js中的類型轉(zhuǎn)換與引用類型(Boolean_Number_String)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03JavaScript進(jìn)制數(shù)之間的互相轉(zhuǎn)換
這篇文章主要介紹了JavaScript進(jìn)制數(shù)之間的互相轉(zhuǎn)換,進(jìn)制轉(zhuǎn)換是人們利用符號來計數(shù)的方法,下文基于JavaScript實現(xiàn)進(jìn)制數(shù)之間的轉(zhuǎn)換,有一定的知識性參考價值,需要的小伙伴可以參考一下2022-05-05IE6中使用position導(dǎo)致頁面變形的解決方案(js代碼)
IE6中使用position導(dǎo)致頁面變形,影響用戶體驗,通過搜索可以通過js來實現(xiàn)。2011-01-01javascript根據(jù)時間生成m位隨機(jī)數(shù)最大13位
javascript根據(jù)時間生成m位隨機(jī)數(shù),最大13位隨機(jī)數(shù),并且不能保證首位不為0,實現(xiàn)代碼如下,需要的朋友可以參考下2014-10-10