今日楼主正在搞原生小程序,想搞一下转发功能,而转发功能就需要获取到小程序码,方便别人识别二维码并进入小程序;
起因,楼主按照官网,先获取access_token;然后拿着access_token去获取小程序码,奈何经验不足,获取回来的二进制流不会处理。不过,奋斗了一上午,中午知道原因在哪了?下面咱们来讲一下。
console.log('小程序码===接口调用')
var that = this;
wx.request({
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' + this.data.access_token, // c
method: "POST",
data: {
scene: 'guoguo'
},
success: function (res) {
console.log(res)
let data = wx.arrayBufferToBase64(res.data);
that.setData({
imgSrc: 'data:image/png;base64,' + data
})
},
fail: function (res) {
console.log('fail')
}
})
获取到的结果为下图,图片的二进制流,并且我用wx.arrayBufferToBase64(res.data)去转这个,为啥也转不出来呢???
好了,言归正传:如何解决呢?其实很简单,咱们忽略了一点,就是请求的响应类型,默认情况下是字符串的,咱们需要 设置为2进制数组,用数组的语法来处理2进制数据;直接上代码!
一段完整的代码【responseType的类型请看官方文档】
var that = this;
wx.request({
url: 'https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=' + this.data.access_token,
method: "POST",
data: {
scene: 'guoguo'
},
responseType: 'arraybuffer', // arraybuffer是以数组的语法处理二进制数据,称为二进制数组。
success: function (res) {
let data = wx.arrayBufferToBase64(res.data);
console.log('wx.arrayBufferToBase64')
console.log(data)
that.setData({
imgSrc: 'data:image/png;base64,' + data
})
},
fail: function (res) {
console.log('fail')
}
})
翻阅了一些资料才知道,这是在RFC2397中定义的Data URI scheme,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。
《HTTP权威指南》对URI和URL的定义:
URL组成:
协议://主机名[:端口]/ 路径/[:参数] [?查询]#Fragment protocol :// hostname[:port] / path / [:parameters][?query]#fragment
URI,URL,URN三者关系:
URL,URN是URI的子集
data URI scheme 允许我们使用内联(inline-code)的方式在网页中包含数据,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。常用于将图片嵌入网页。
data:[][;charset= ][; ], 1. data :协议名称; 2. [ ] :可选项,数据类型(image/png、text/plain等) 3. [;charset= ] :可选项,源文本的字符集编码方式 4. [; ] :数据编码方式(默认US-ASCII,BASE64两种) 5. , :编码后的数据
data:, 文本数据 data:text/plain, 文本数据 data:text/html, HTML代码 data:text/html;base64, base64编码的HTML代码 data:text/css, CSS代码 data:text/css;base64, base64编码的CSS代码 data:text/javascript, Javascript代码 data:text/javascript;base64, base64编码的Javascript代码 data:image/gif;base64, base64编码的gif图片数据 data:image/png;base64, base64编码的png图片数据 data:image/jpeg;base64, base64编码的jpeg图片数据 data:image/x-icon;base64, base64编码的icon图片数据
data:image/png;base64相当于图片的Data URL,它是利用base64编码把图片数据翻译成标准ASCII字符,等同于
换句话说我们把图像文件的内容内置在 HTML 文件中,节省了一个 HTTP 请求