微信小程序網(wǎng)絡(luò)請(qǐng)求封裝示例
網(wǎng)絡(luò)請(qǐng)求
網(wǎng)絡(luò)請(qǐng)求小程序提供了wx.request, 仔細(xì)看一下 api,這不就是n年前的 $.ajax 嗎,好古老啊。
// 官方例子
wx.request({
url: 'test.php', //僅為示例,并非真實(shí)的接口地址
data: {
x: '' ,
y: ''
},
header: {
'content-type': 'application/json' // 默認(rèn)值
},
success: function(res) {
console.log(res.data)
}
})
小程序支持ES6,那么就應(yīng)該支持Promise 了,很開心~, 話不多說直接上代碼吧
Promise封裝
const baseUrl = 'https://api.it120.cc';
const http = ({ url = '', param = {}, ...other } = {}) => {
wx.showLoading({
title: '請(qǐng)求中,請(qǐng)耐心等待..'
});
let timeStart = Date.now();
return new Promise((resolve, reject) => {
wx.request({
url: getUrl(url),
data: param,
header: {
'content-type': 'application/json' // 默認(rèn)值 ,另一種是 "content-type": "application/x-www-form-urlencoded"
},
...other,
complete: (res) => {
wx.hideLoading();
console.log(`耗時(shí)${Date.now() - timeStart}`);
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.data)
} else {
reject(res)
}
}
})
})
}
const getUrl = (url) => {
if (url.indexOf('://') == -1) {
url = baseUrl + url;
}
return url
}
// get方法
const _get = (url, param = {}) => {
return http({
url,
param
})
}
const _post = (url, param = {}) => {
return http({
url,
param,
method: 'post'
})
}
const _put = (url, param = {}) => {
return http({
url,
param,
method: 'put'
})
}
const _delete = (url, param = {}) => {
return http({
url,
param,
method: 'put'
})
}
module.exports = {
baseUrl,
_get,
_post,
_put,
_delete
}
使用
const api = require('../../utils/api.js')
// 單個(gè)請(qǐng)求
api.get('list').then(res => {
console.log(res)
}).catch(e => {
console.log(e)
})
// 一個(gè)頁面多個(gè)請(qǐng)求
Promise.all([
api.get('list'),
api.get(`detail/${id}`)
]).then(result => {
console.log(result)
}).catch(e => {
console.log(e)
})
登陸問題
做一個(gè)應(yīng)用,肯定避免不了登錄操作。用戶的個(gè)人信息啊,相關(guān)的收藏列表等功能都需要用戶登錄之后才能操作。一般我們使用token做標(biāo)識(shí)。
小程序并沒有登錄界面,使用的是 wx.login 。 wx.login 會(huì)獲取到一個(gè) code,拿著該 code 去請(qǐng)求我們的后臺(tái)會(huì)最后返回一個(gè)token到小程序這邊,保存這個(gè)值為 token 每次請(qǐng)求的時(shí)候帶上這個(gè)值。
一般還需要把用戶的信息帶上比如用戶微信昵稱,微信頭像等,這時(shí)候就需要使用 wx.getUserInfo ,這里涉及到一個(gè)用戶授權(quán)的問題
帶上用戶信息就夠了嘛? too young too simple!我們的項(xiàng)目不可能只有小程序,相應(yīng)的微信公眾平臺(tái)可能還有相應(yīng)的App,我們需要把賬號(hào)系統(tǒng)打通,讓用戶在我們的項(xiàng)目中的賬戶是同一個(gè)。這就需要用到微信開放平臺(tái)提供的 UnionID 。
登陸
//app.js
App({
onLaunch: function () {
console.log('App onLaunch');
var that = this;
// 獲取商城名稱
wx.request({
url: 'https://api.it120.cc/'+ that.globalData.subDomain +'/config/get-value',
data: {
key: 'mallName'
},
success: function(res) {
wx.setStorageSync('mallName', res.data.data.value);
}
})
this.login();
this.getUserInfo();
},
login : function () {
var that = this;
var token = that.globalData.token;
// 如果有token
if (token) {
// 檢查token是否有效
wx.request({
url: 'https://api.it120.cc/' + that.globalData.subDomain + '/user/check-token',
data: {
token: token
},
success: function (res) {
// 如果token失效了
if (res.data.code != 0) {
that.globalData.token = null;
that.login(); // 重新登陸
}
}
})
return;
}
// 【1】調(diào)用微信自帶登陸
wx.login({
success: function (res) {
// 【2】 拿到code去訪問我們的后臺(tái)換取其他信息
wx.request({
url: 'https://api.it120.cc/'+ that.globalData.subDomain +'/user/wxapp/login',
data: {
code: res.code
},
success: function(res) {
// 如果說這個(gè)code失效的
if (res.data.code == 10000) {
// 去注冊(cè)
that.registerUser();
return;
}
// 如果返回失敗了
if (res.data.code != 0) {
// 登錄錯(cuò)誤
wx.hideLoading();
// 提示無法登陸
wx.showModal({
title: '提示',
content: '無法登錄,請(qǐng)重試',
showCancel:false
})
return;
}
// 【3】 如果成功后設(shè)置token到本地
that.globalData.token = res.data.data.token;
// 保存用戶信息
wx.setStorage({
key: 'token',
data: res.data.data.token
})
}
})
}
})
},
// 注冊(cè)?? [這個(gè)看需求]
registerUser: function () {
var that = this;
wx.login({
success: function (res) {
var code = res.code; // 微信登錄接口返回的 code 參數(shù),下面注冊(cè)接口需要用到
wx.getUserInfo({
success: function (res) {
var iv = res.iv;
var encryptedData = res.encryptedData;
// 下面開始調(diào)用注冊(cè)接口
wx.request({
url: 'https://api.it120.cc/' + that.globalData.subDomain +'/user/wxapp/register/complex',
data: {code:code,encryptedData:encryptedData,iv:iv}, // 設(shè)置請(qǐng)求的 參數(shù)
success: (res) =>{
wx.hideLoading();
that.login();
}
})
}
})
}
})
},
// 獲取用戶信息
getUserInfo:function() {
wx.getUserInfo({
success:(data) =>{
this.globalData.userInfo = data.userInfo;
wx.setStorage({
key: 'userInfo',
data: data.userInfo
})
return this.globalData.userInfo;
}
})
},
globalData:{
userInfo:null,
subDomain:"34vu54u7vuiuvc546d",
token: null
}
})
授權(quán)問題

getUserInfo: function () {
// 先調(diào)用wx.getSetting 獲取用戶權(quán)限設(shè)置
wx.getSetting({
success(res) {
console.log('1');
if (!res.authSetting['scope.userInfo']) {
wx.authorize({
scope: 'scope.userInfo',
success() {
// 用戶已經(jīng)同意小程序使用錄音功能,后續(xù)調(diào)用 wx.getUserInfo接口不會(huì)彈窗詢問
wx.getUserInfo({
success: (data) => {
this.globalData.userInfo = data.userInfo;
wx.setStorage({
key: 'userInfo',
data: data.userInfo
})
return this.globalData.userInfo;
}
})
}
})
} else {
console.log(2);
}
}
})
},
小結(jié)
網(wǎng)絡(luò)請(qǐng)求這塊,算目前開發(fā)項(xiàng)目中必不可少的一塊加油~~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript實(shí)現(xiàn)圖片自動(dòng)加載的瀑布流效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)圖片自動(dòng)加載的瀑布流效果的相關(guān)資料,需要的朋友可以參考下2016-04-04
layuimini框架實(shí)現(xiàn)點(diǎn)擊菜單欄回到起始頁的解決方案
這篇文章主要介紹了layuimini框架實(shí)現(xiàn)點(diǎn)擊菜單欄回到起始頁的解決方案,本文通過圖文示例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06
微信小程序如何同時(shí)獲取用戶信息和用戶手機(jī)號(hào)
小程序登錄是現(xiàn)在小程序里面很普遍的一個(gè)功能,因?yàn)楣俜教峁┑姆椒?可以一鍵獲取到用戶信息,一鍵拿到手機(jī)號(hào),這篇文章主要給大家介紹了關(guān)于微信小程序如何同時(shí)獲取用戶信息和用戶手機(jī)號(hào)的相關(guān)資料,需要的朋友可以參考下2021-08-08
JavaScript使用concat連接數(shù)組的方法
這篇文章主要介紹了JavaScript使用concat連接數(shù)組的方法,實(shí)例分析了javascript中concat函數(shù)操作數(shù)組的技巧,需要的朋友可以參考下2015-04-04
利用Javascript判斷操作系統(tǒng)的類型實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性
在通過Javascript實(shí)現(xiàn)客戶端和服務(wù)端的交互時(shí),有時(shí)候需要對(duì)操作系統(tǒng)進(jìn)行判斷,以便實(shí)現(xiàn)不同操作系統(tǒng)下的兼容性;從而實(shí)現(xiàn)網(wǎng)站在跨平臺(tái)瀏覽時(shí)候保持良好的用戶體驗(yàn),感興趣的朋友可以了解下啊,或許對(duì)你有所幫助2013-01-01
js+css實(shí)現(xiàn)導(dǎo)航效果實(shí)例
這篇文章主要介紹了js+css實(shí)現(xiàn)導(dǎo)航效果,實(shí)例分析了下拉菜單導(dǎo)航的js實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
奉獻(xiàn)給JavaScript初學(xué)者的編寫開發(fā)的七個(gè)細(xì)節(jié)
每種語言都有它特別的地方,對(duì)于JavaScript來說,使用var就可以聲明任意類型的變量,這門腳本語言看起來很簡(jiǎn)單,然而想要寫出優(yōu)雅的代碼卻是需要不斷積累經(jīng)驗(yàn)的。本文利列舉了JavaScript初學(xué)者應(yīng)該注意的七個(gè)細(xì)節(jié),與大家分享。2011-01-01

