微信小程序wx.request的簡(jiǎn)單封裝
這些天團(tuán)隊(duì)里開(kāi)始做小程序開(kāi)發(fā)了,之前沒(méi)做過(guò),都是第一次,第一次的感覺(jué)大家都懂的。周末看了一下小程序項(xiàng)目的代碼,在網(wǎng)絡(luò)請(qǐng)求上發(fā)現(xiàn)了一些小問(wèn)題,最終沒(méi)忍住想了點(diǎn)辦法把request封裝了一下。下面來(lái)看看吧。
看項(xiàng)目代碼時(shí)發(fā)現(xiàn)了下面幾點(diǎn)問(wèn)題:
- 網(wǎng)絡(luò)請(qǐng)求都寫在Page里,每個(gè)請(qǐng)求都要重復(fù)的寫wx.request以及一些基礎(chǔ)配置;
- 每個(gè)頁(yè)面里都要處理相同類型的異常;
- 后端返的http status code為200以外時(shí),并不能直接進(jìn)入fail對(duì)應(yīng)函數(shù)進(jìn)行處理;
針對(duì)這些問(wèn)題,首先在項(xiàng)目目錄里新建了一個(gè)apis的目錄,把所有與API請(qǐng)求的東西都放在這個(gè)目錄里,如下圖這樣。
1. 新建一個(gè)request類,對(duì)wx.request進(jìn)行簡(jiǎn)單封裝 在request類里做了以下幾件事:
- 在構(gòu)造函數(shù)里創(chuàng)建默認(rèn)請(qǐng)求的http header,可以在header里配制一些內(nèi)容,在對(duì)應(yīng)請(qǐng)求方法中如果沒(méi)有設(shè)置header參數(shù),就使用此默認(rèn)header參數(shù);
- 以get post delete put等方法對(duì)request進(jìn)行封裝,在發(fā)起網(wǎng)絡(luò)請(qǐng)求不需要重復(fù)的寫wx.request({method:xxx})這些代碼,只要調(diào)用getRequest、postRequest等方法就可以了;
- 在rquest的結(jié)果返回處理函數(shù)success中,判定服務(wù)端返回的狀態(tài)代碼,對(duì)于200狀態(tài)代碼的按業(yè)務(wù)處理成功處理,對(duì)于非200的狀態(tài)碼按異常處理。
- 預(yù)留統(tǒng)一異常處理函數(shù)處理接口,可以通過(guò)setErrorHandler來(lái)設(shè)置統(tǒng)一的異常處理,這樣對(duì)于一些可以統(tǒng)一處理的異常就不用在業(yè)務(wù)頁(yè)面里去重復(fù)處理了,例如后端返回401的代碼,就可以統(tǒng)一轉(zhuǎn)到登錄頁(yè)面讓用戶登錄了;
- 此request不限定服務(wù)提供都,可以是自己開(kāi)發(fā)的業(yè)務(wù)服務(wù)端,也可以用于第三方服務(wù)的調(diào)用;
/** * name: api.js * description: request處理基礎(chǔ)類 * author: 徐磊 * date: 2018-5-19 */ class request { constructor() { this._header = {} } /** * 設(shè)置統(tǒng)一的異常處理 */ setErrorHandler(handler) { this._errorHandler = handler; } /** * GET類型的網(wǎng)絡(luò)請(qǐng)求 */ getRequest(url, data, header = this._header) { return this.requestAll(url, data, header, 'GET') } /** * DELETE類型的網(wǎng)絡(luò)請(qǐng)求 */ deleteRequest(url, data, header = this._header) { return this.requestAll(url, data, header, 'DELETE') } /** * PUT類型的網(wǎng)絡(luò)請(qǐng)求 */ putRequest(url, data, header = this._header) { return this.requestAll(url, data, header, 'PUT') } /** * POST類型的網(wǎng)絡(luò)請(qǐng)求 */ postRequest(url, data, header = this._header) { return this.requestAll(url, data, header, 'POST') } /** * 網(wǎng)絡(luò)請(qǐng)求 */ requestAll(url, data, header, method) { return new Promise((resolve, reject) => { wx.request({ url: url, data: data, header: header, method: method, success: (res => { if (res.statusCode === 200) { //200: 服務(wù)端業(yè)務(wù)處理正常結(jié)束 resolve(res) } else { //其它錯(cuò)誤,提示用戶錯(cuò)誤信息 if (this._errorHandler != null) { //如果有統(tǒng)一的異常處理,就先調(diào)用統(tǒng)一異常處理函數(shù)對(duì)異常進(jìn)行處理 this._errorHandler(res) } reject(res) } }), fail: (res => { if (this._errorHandler != null) { this._errorHandler(res) } reject(res) }) }) }) } } export default request
2. 新建一個(gè)agriknow類 在agriknow里面做了以下幾件事:
- 實(shí)現(xiàn)所有業(yè)務(wù)服務(wù)調(diào)用,如查詢所有新聞列表【getNews】,查詢所有課程列表【getCourseList】;
- 實(shí)現(xiàn)統(tǒng)一的異常處理,并傳給request;
- 將服務(wù)端返回的結(jié)果response轉(zhuǎn)成response.data回傳給API調(diào)用的地方;
/** * name: agriknow.js * description: 農(nóng)知匯服務(wù)器提供的服務(wù) * author: 徐磊 * date: 2018-5-19 */ import request from './request.js' class agriknow { constructor() { this._baseUrl = 'https://apis.xxx.xxx.com/dev/apis/train/v1/' this._defaultHeader = { 'data-tupe': 'application/json' } this._request = new request this._request.setErrorHandler(this.errorHander) } /** * 統(tǒng)一的異常處理方法 */ errorHander(res) { console.error(res) } /** * 查詢所有新聞列表 */ getNews(page = 1, size = 10) { let data = { page: page, size: size } return this._request.getRequest(this._baseUrl + 'news/client', data).then(res => res.data) } /** * 獲取所有課程 */ getCourseList(page = 1, size = 10, key = null) { let data = key != null ? { page: page, size: size, queryValue: key } : { page: page, size: size } return this._request.getRequest(this._baseUrl + '/course/mobile', data).then(res => res.data) } } export default agriknow
3. 函數(shù)的調(diào)用
在app中引用argriknow
import agriknow from './apis/agriknow.js' App({ onLaunch: function () { // 展示本地存儲(chǔ)能力 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) …… ……
定義一個(gè)類型為agriknow的屬性并實(shí)例化
import agriknow from './apis/agriknow.js' App({ onLaunch: function () { // 展示本地存儲(chǔ)能力 var logs = wx.getStorageSync('logs') || [] logs.unshift(Date.now()) wx.setStorageSync('logs', logs) …… …… }, agriknow:new agriknow() })
在Page里調(diào)用
const app = getApp(); Page({ data: { courseData: [], page: 1, size: 10, total: 0 }, onLoad: function () { …… …… wx.startPullDownRefresh() this.getdataList(); }, //查詢課程列表 getdataList() { app.agriknow.getCourseList(this.data.page++, this.data.size, '') .then(res => { wx.stopPullDownRefresh() let list = this.data.page > 2 ? this.data.courseData.concat(res.list) : res.list this.setData({ courseData: list }) }) .catch(res => { wx.stopPullDownRefresh() wx.showToast({ title: '出錯(cuò)了!', icon: 'none' }) }) }, //下拉刷新 onPullDownRefresh() { console.log("下拉刷新"); this.getdataList(); }, …… …… })
所有的東西大概就是這個(gè)樣子了,就這么個(gè)意思,希望對(duì)大家有點(diǎn)用。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js案例之鼠標(biāo)跟隨jquery版(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇js案例之鼠標(biāo)跟隨jquery版(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07JS實(shí)現(xiàn)表格響應(yīng)式布局技巧
這篇文章主要為大家介紹了JS實(shí)現(xiàn)表格響應(yīng)式布局技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果
本文主要介紹了js實(shí)現(xiàn)簡(jiǎn)單的二級(jí)聯(lián)動(dòng)效果的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03Javascript實(shí)現(xiàn)字?jǐn)?shù)統(tǒng)計(jì)
現(xiàn)在流行的Twitter等微博客網(wǎng)站,有一個(gè)很好的用戶體驗(yàn),就是在文本框中輸入文字的時(shí)候,會(huì)自動(dòng)統(tǒng)計(jì)輸入的字符,并顯示用戶還能輸入的字符,在限制了140個(gè)字的微博客中,這樣的小提示可以很好的增強(qiáng)用戶體驗(yàn)。2015-07-07代碼塊高亮可復(fù)制顯示js插件highlight.js+clipboard.js整合
最近有個(gè)需求是將jsp頁(yè)面上的某一段代碼塊格式化成類似CSDN的代碼塊的樣式,而且很多平臺(tái)都使用了這樣的功能,下面就為大家簡(jiǎn)單分享一下2021-02-02js實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)轉(zhuǎn)盤抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03js猜數(shù)字小游戲的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章介紹了js猜數(shù)字小游戲的簡(jiǎn)單實(shí)現(xiàn)代碼,很好玩的游戲哦,可以看看你的智商 是否驚人額2013-07-07