小程序
小游戏
企业微信
微信支付
扫描小程序码分享
我的小程序页面有两个 request,前一个发送到平台调用 钥 ,获取密钥之后该怎么将密钥反馈进下一个request 的header 里面作为输入的数据?
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
重写wx.request,多加一个参数token,参数token为true时会获取缓存的token,缓存token不存在则会先请求获取token,再携带token请求业务接口
// utils/overWrite.js let { request } = wx Object.defineProperty(wx, 'request', { async value(p){ if(p.token){ delete p.token // 从globalData或缓存中取token,这里以缓存为例 var token = wx.getStorageSync('x-auth-token') || '' if(!token){ // 不存在token,则请求获取token var res = await new Promise((rs, rj)=>{ request({ url:'这里填写你的token获取地址', success: res=>rs(res), faile: e=>rj(e), }) }) // 假设返回结果为{token:'xxxxxxxxxxxxx'} console.log(res) token = res.data.token || '' if(token){ // 存于globalData或缓存中,这里以缓存为例 wx.setStorageSync('x-auth-token', token) }else{ console.error('获取token失败') } } // 合并header p.header = Object.assign(p.header || {}, {'X-Auth-Token':token}) return request.call(this, p) } } })
在app.js头部引用overWrite.js
require('./utils/overWrite') App({ onLaunch: function () {} })
在页面中使用
// pages/index/index.js Page({ onLoad: function () { // 普通请求,不需要token wx.request({ url: '你的业务接口地址' }) // 需要带token请求 wx.request({ token:!0, url: '你的业务接口地址' }) }, })
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
"name": "cn-north-4"//服务器地址 北京-4
}
},
header: {
'content-type': 'application/json;charset=utf8' // 默认值
success: res => rs(res),
faile: e => rj(e),
})
// 假设返回结果为{token:'xxxxxxxxxxxxx'}
console.log(res)
token = res.header['X-Subject-Token'] || ''
//token获取地址
if (token) {
// 存于globalData或缓存中,这里以缓存为例
wx.setStorageSync('x-auth-token', token)
} else {
console.error('获取token失败')
// 合并header
p.header = Object.assign(p.header || {}, { 'X-Auth-Token': token })
return request.call(this, p)
//app.js
require('./utils/common.js')
App({
globalData: {
data1: '',
token:''
onLaunch: function () { }
// utils/common.js
let { request } = wx
Object.defineProperty(wx, 'request', {
async value(p) {
if (p.token) {
delete p.token
// 从globalData或缓存中取token,这里以缓存为例
var token = wx.getStorageSync('x-auth-token') || ''
if (!token) {
// 不存在token,则请求获取token
var res = await new Promise((rs, rj) => {
request({
url: 'https://iam.myhuaweicloud.com/v3/auth/tokens',
method: "POST",
data: {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"name": "xxxxxxxxxxx",//iam
"password": "xxxxxxxxxxx",//iam
"domain": {
"name": "xxxxxxxxxxx"//iam
"scope": {
"project": {
小程序的请求都是异步的,无法通过属性设置为同步。所以你可以:
1、把第二个请求放到第一个请求的success里写。
2、通过封装callback回调方法的方式,把第二次请求放到第一次请求的回调中执行
3、通过引入Promise, async 以及 await的方式同步.
前一个 request 的success 方法里面 写下一个request
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
重写wx.request,多加一个参数token,参数token为true时会获取缓存的token,缓存token不存在则会先请求获取token,再携带token请求业务接口
// utils/overWrite.js let { request } = wx Object.defineProperty(wx, 'request', { async value(p){ if(p.token){ delete p.token // 从globalData或缓存中取token,这里以缓存为例 var token = wx.getStorageSync('x-auth-token') || '' if(!token){ // 不存在token,则请求获取token var res = await new Promise((rs, rj)=>{ request({ url:'这里填写你的token获取地址', success: res=>rs(res), faile: e=>rj(e), }) }) // 假设返回结果为{token:'xxxxxxxxxxxxx'} console.log(res) token = res.data.token || '' if(token){ // 存于globalData或缓存中,这里以缓存为例 wx.setStorageSync('x-auth-token', token) }else{ console.error('获取token失败') } } // 合并header p.header = Object.assign(p.header || {}, {'X-Auth-Token':token}) return request.call(this, p) } } })
在app.js头部引用overWrite.js
require('./utils/overWrite') App({ onLaunch: function () {} })
在页面中使用
// pages/index/index.js Page({ onLoad: function () { // 普通请求,不需要token wx.request({ url: '你的业务接口地址' }) // 需要带token请求 wx.request({ token:!0, url: '你的业务接口地址' }) }, })
若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人
"name": "cn-north-4"//服务器地址 北京-4
}
}
}
},
header: {
'content-type': 'application/json;charset=utf8' // 默认值
},
success: res => rs(res),
faile: e => rj(e),
})
})
// 假设返回结果为{token:'xxxxxxxxxxxxx'}
console.log(res)
token = res.header['X-Subject-Token'] || ''
//token获取地址
if (token) {
// 存于globalData或缓存中,这里以缓存为例
wx.setStorageSync('x-auth-token', token)
} else {
console.error('获取token失败')
}
}
// 合并header
p.header = Object.assign(p.header || {}, { 'X-Auth-Token': token })
return request.call(this, p)
}
}
})
//app.js
require('./utils/common.js')
App({
globalData: {
data1: '',
token:''
},
onLaunch: function () { }
})
// utils/common.js
let { request } = wx
Object.defineProperty(wx, 'request', {
async value(p) {
if (p.token) {
delete p.token
// 从globalData或缓存中取token,这里以缓存为例
var token = wx.getStorageSync('x-auth-token') || ''
if (!token) {
// 不存在token,则请求获取token
var res = await new Promise((rs, rj) => {
request({
url: 'https://iam.myhuaweicloud.com/v3/auth/tokens',
method: "POST",
data: {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"name": "xxxxxxxxxxx",//iam
"password": "xxxxxxxxxxx",//iam
"domain": {
"name": "xxxxxxxxxxx"//iam
}
}
}
},
"scope": {
"project": {
[ 能复现问题的简单的 ] 代码片段
https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html
小程序的请求都是异步的,无法通过属性设置为同步。所以你可以:
1、把第二个请求放到第一个请求的success里写。
2、通过封装callback回调方法的方式,把第二次请求放到第一次请求的回调中执行
3、通过引入Promise, async 以及 await的方式同步.
前一个 request 的success 方法里面 写下一个request