微信小程序已經(jīng)成為了人們?nèi)粘I钪斜夭豢缮俚囊徊糠?。隨著微信小程序平臺的發(fā)展,開發(fā)者們也有了更多的可操作性。在這里,我們將探討微信小程序網(wǎng)絡請求的相關(guān)問題,為您提供一系列解決方案,幫助您提高代碼復用。
一、問題
微信小程序網(wǎng)絡請求常常遇到的問題之一就是請求方法的重復使用。當您有多個頁面需要調(diào)用同一個接口時,如果每個頁面都去寫一次請求代碼的話,豈不是太過于冗余了嗎?這樣一來,不僅增加了代碼的復雜度,還浪費了代碼書寫的時間成本。因此,通用請求方法的封裝是必不可少的。
二、解決方案
1.統(tǒng)一請求方法封裝
在微信小程序中,網(wǎng)絡請求可以通過 wx.request() 方法進行調(diào)用。為了提高代碼復用性,我們可以使用封裝通用請求方法的方式,將請求代碼統(tǒng)一管理起來。例如:
```
//app.js中定義請求方法
App({
globalData: {},
apiUrl: 'https://www.example.com',
request(url, data = {}, method = 'GET') {
const token = wx.getStorageSync('token');
return new Promise((resolve, reject) => {
wx.request({
url: `${this.apiUrl}${url}`,
method,
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${token}`
},
success: (res) => {
resolve(res.data);
},
fail: (err) => {
reject(err);
}
})
})
}
})
```
這里我們將請求方法封裝在了 app.js 中,并設(shè)置了全局的 apiUrl 和 header 參數(shù),讓所有的請求方法都可以使用。
2.調(diào)用請求方法
當我們需要在單個頁面中調(diào)用請求方法時,只需引用 app.js 文件中定義的全局函數(shù),而不用在每個頁面中分別書寫請求代碼。例如:
```
//index.js中調(diào)用請求方法
const app = getApp();
Page({
data: {
list: []
},
onLoad() {
this.getList();
},
getList() {
app.request('/list').then(res => {
this.setData({
list: res,
})
})
}
})
```
這里我們在 index.js 中直接使用 app.js 文件中定義的請求方法,同時也得到了 app.js 中設(shè)置的全局 apiUrl 和 header 參數(shù)。
3.傳遞參數(shù)
在封裝通用請求方法時,我們也需要考慮到一些特殊情況,例如有多個參數(shù)需要傳遞時。在這種情況下,可以使用 ES6 的解構(gòu)賦值來傳遞參數(shù),例如:
```
//app.js中定義請求方法
request(url, { data, method = 'GET', header } = {}) {}
//index.js中調(diào)用請求方法
app.request('/list', {
data: {
page: 1,
limit: 10
},
header: {
'Content-Type': 'application/json',
}
})
```
在這里,我們對 data、method 和 header 這三個參數(shù)使用了解構(gòu)賦值,并給了默認值。在調(diào)用請求方法時,我們可以根據(jù)參數(shù)需要直接傳遞 {}
4.錯誤處理
在實際開發(fā)中,網(wǎng)絡請求不可避免會出現(xiàn)錯誤,例如網(wǎng)絡故障等等。因此,在請求方法中,我們需要加入錯誤處理的邏輯,例如:
```
//app.js中定義請求方法
request(url, { data, method = 'GET', header } = {}) {
const token = wx.getStorageSync('token');
return new Promise((resolve, reject) => {
wx.request({
url: `${this.apiUrl}${url}`,
method,
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${token}`,
...header,
},
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data);
} else {
reject(res);
}
},
fail: (err) => {
reject(err);
}
})
})
}
//index.js中調(diào)用請求方法
app.request('/list').then(res => {
this.setData({
list: res,
})
}).catch(err => {
console.error(err);
})
```
在這里,我們加入了錯誤處理邏輯,如果請求成功,則返回請求結(jié)果。而如果請求失敗,則會進入 catch 塊中處理錯誤邏輯。
5.優(yōu)化請求方法
在某些場景下,我們需要進行數(shù)據(jù)緩存。例如我們需要展示的列表數(shù)據(jù),并不是實時獲取的。此時,我們可以進行數(shù)據(jù)緩存優(yōu)化,例如:
```
//app.js中定義請求方法
request(url, { data, method = 'GET', header } = {}, cache = false) {
const token = wx.getStorageSync('token');
const cacheKey = `${url}-${JSON.stringify(data)}`;
if (cache && wx.getStorageSync(cacheKey)) {
return Promise.resolve(wx.getStorageSync(cacheKey));
}
return new Promise((resolve, reject) => {
wx.request({
url: `${this.apiUrl}${url}`,
method,
data,
header: {
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': `Bearer ${token}`,
...header,
},
success: (res) => {
if (res.statusCode === 200) {
resolve(res.data);
} else {
reject(res);
}
},
fail: (err) => {
reject(err);
}
})
}).then(res => {
wx.setStorageSync(cacheKey, res);
return res;
})
}
//index.js中調(diào)用請求方法
app.request('/list', {}, true);
```
在這里,我們添加了 cache 參數(shù)控制是否開啟緩存,并使用 wx.setStorageSync() 和 wx.getStorageSync() 實現(xiàn)數(shù)據(jù)緩存。當然,這種方式需要考慮到cache超時時間的問題。
三、總結(jié)
通過以上的解決方案,我們可以將通用請求方法進行有效的封裝和優(yōu)化,大大提升代碼的復用性和開發(fā)效率,從而更好地滿足開發(fā)者對微信小程序網(wǎng)絡請求的需求。當然,我們需要根據(jù)不同的業(yè)務場景,不斷地探究可行的解決方案,不斷提高代碼的復用性和開發(fā)效率。