闲来无事,无意中发现云函数中的request网络请求可以不用配置校验域名和https,也就是说可以通过云函数封装一个请求通用函数来处理没有域名和https的网络请求(甚至包括内网穿透,可以用非80端口进行实验)。
适用场景:
A、没有域名或使用局域网(直接使用IP访问);
B、使用花生壳动态域名解析(内网穿透);
C、有域名但不想申请配置HTTPS(懒人);
D、连自己的服务器都没有,接口直接使用开源或者第三方接口且不能添加域名校验的情况(空壳);
E、不愿意直接在小程序中直接暴露自己逻辑API实际请求地址的(安全);
······
具体步骤如下:
1、给项目添加云函数支持(https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)
2、新建名为“proxy”的云函数,配置支持request-promise
// package.json { "name" : "proxy" , "version" : "1.0.0" , "description" : "" , "main" : "index.js" , "scripts" : { "test" : "echo \"Error: no test specified\" && exit 1" }, "author" : "" , "license" : "ISC" , "dependencies" : { "wx-server-sdk" : "latest" , "request" : "latest" , "request-promise" : "latest" } } |
const cloud = require( 'wx-server-sdk' ) const rq = require( 'request-promise' ) cloud.init() // 云函数入口函数 // event为小程序调用的时候传递参数,包含请求参数uri、headers、body exports.main = async (event, context) => { return await rq({ method: 'POST' , uri: event.uri, headers: event.headers ? event.headers : {}, body: event.body }).then(body => { return body }). catch (err => { return err }) } |
3、在小程序中调用云函数请求数据请求
onLoad: function (){ // 初始化 wx.cloud.init() }, onGetItemList: function (){ wx.cloud.callFunction({ name: 'proxy' , data: { // http域名 https域名 第三方域名 非验证域名 IP[:prot] 内网IP或花生壳域名 uri: 'http://192.168.1.100:8081' , headers: { 'Content-Type' : 'application/json' }, body: { uid: 1 } } }).then(res => { console.log(res) const data = res.result console.log(data) // do something }) } |
然后你会发现你已经无所不能了。
个人见解,如有不妥之处,望各位大神指正!~
是的,这是官方特性,它静静地躺在那,终于等到有心人发现。:)
不许改哦。。说好了哦!
为嘛你名字后有icon
11月份的奖章哟~我仿佛已经看见论坛勋章墙了
我也想要
根据我的估算 一个月有20个赞 就行了
这个是特性
不是 bug
不然云函数
为什么那么屌
我就想问
支付宝
你们什么时候抄
没有云的头条
你们怎么抄
百度
会不会抄
---
支付宝在内测了
我看过他们的文档
没理解错
他们就是抄了点
表面的东西
啊哈哈
杠精我来提几个缺点:
1:云开发从2.2.3基础库才开始支持。
2:额度不足,如果把所有请求都用云函数来转发调用,那平均一个用户一天的调用次数非常多,而云函数是有调用限制的,即使提升额度,小程序量级稍微大一些,都是吃不消的。
3:未来云开发可能收费,云函数亦可能会成为云开发收费项目,例如云函数调用次数,使用带宽/流量,消耗资源,都是可计费项目。
4:慢,云函数本身速度不快,在此基础上做转发请求,体验会很差
1:云开发从2.2.3基础库才开始支持。
----
通过配置 cloud:true 可以做到所有的客户端支持
2:额度不足,如果把所有请求都用云函数来转发调用,那平均一个用户一天的调用次数非常多,而云函数是有调用限制的,即使提升额度,小程序量级稍微大一些,都是吃不消的。
----
目前发邮件申请的话,基本配额是无限的
3:未来云开发可能收费,云函数亦可能会成为云开发收费项目,例如云函数调用次数,使用带宽/流量,消耗资源,都是可计费项目。
----
我们会尽量做到便宜
4:慢,云函数本身速度不快,在此基础上做转发请求,体验会很差
----
是的,现在性能是很有问题,优化马上就要上了,相信应该会快很多。
云函数 一直都不用配置 的 一直的都可以访问外网的,
支持用云函数做代理什么 的 速度很慢的 云函数本身就很慢 调用次数还有限制。
所以并没有多少人用这功能 实在 太慢了
并不是什么bug。
的确是这样的,不过限制好像可以申请上调,具体规则不明。
如果要配置,云函数就很鸡肋了
是可以绕过域名限制 但是局域网ip还是请求不了 除非用微信的wx.request
get 如何实现?
method:
'GET'
,
有微信或者QQ没有,请教下!
复制粘贴你的代码不知道为什么报错了
我也出现过类似的错误!
我的请求是get方法,将参数body改为qs后解决。如下:
...
exports.main = async (event, context) => {
return await rq({
method: 'GET',
uri: event.uri,
headers: event.headers ? event.headers : {},
qs:event.qs
}).then(qs => {
return qs
}).catch(err => {
return err
})
}
...
...
getStockData: function (code, sdate, edate) { // 调用云函数请求股票指数数据
return new Promise((resolve, reject)=>{
wx.cloud.callFunction({
name:'getdata',
data:{
uri: STOCK_URL,
headers: {
'Content-Type': 'application/json'
},
qs:{
code: code,
start: sdate,
end: edate,
stat: '1',
order: 'D',
period: 'd',
callback: 'historySearchHandle',
rt: 'jsonp',
}
},
success: (res) => {
// console.log(res)
resolve(res)
},
fail: (res) => {
console.log(res)
reject(res)
}
})
})
},
...
是不是很惊喜
这个早就发现了,不是bug,因为云函数有调用次数限制,用云函数做代理基本行不通。十几个用户就撑死了。+