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-09
js類型轉(zhuǎn)換與引用類型詳解(Boolean_Number_String)
本篇文章主要是對js中的類型轉(zhuǎn)換與引用類型(Boolean_Number_String)進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-03-03
JavaScript進(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-05
IE6中使用position導(dǎo)致頁面變形的解決方案(js代碼)
IE6中使用position導(dǎo)致頁面變形,影響用戶體驗,通過搜索可以通過js來實現(xiàn)。2011-01-01
javascript根據(jù)時間生成m位隨機(jī)數(shù)最大13位
javascript根據(jù)時間生成m位隨機(jī)數(shù),最大13位隨機(jī)數(shù),并且不能保證首位不為0,實現(xiàn)代碼如下,需要的朋友可以參考下2014-10-10

