收藏
回答

利用云函数绕过域名校验和HTTPS配置,实现内网加端口访问

闲来无事,无意中发现云函数中的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"
    }
}

// 云函数入口文件index.js

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
    })
}

然后你会发现你已经无所不能了。


个人见解,如有不妥之处,望各位大神指正!~

最后一次编辑于  2018-12-03
回答关注问题邀请回答
收藏

17 个回答

  • LeeHey
    LeeHey
    置顶回答2018-12-03

    是的,这是官方特性,它静静地躺在那,终于等到有心人发现。:)

    2018-12-03
    有用 9
    回复 18
    查看更多(13)
  • 黄牌下场啦
    黄牌下场啦
    2018-12-03

    这个是特性


    不是 bug


    不然云函数


    为什么那么屌


    我就想问


    支付宝


    你们什么时候抄


    没有云的头条


    你们怎么抄


    百度


    会不会抄


    ---



    2018-12-03
    有用 3
    回复 2
    • 2018-12-04

      支付宝在内测了

      2018-12-04
      1
      回复
    • 黄牌下场啦
      黄牌下场啦
      2018-12-05回复

      我看过他们的文档


      没理解错


      他们就是抄了点


      表面的东西


      啊哈哈

      2018-12-05
      回复
  • 染柒
    染柒
    2018-12-05

    杠精我来提几个缺点:


            1:云开发从2.2.3基础库才开始支持。


            2:额度不足,如果把所有请求都用云函数来转发调用,那平均一个用户一天的调用次数非常多,而云函数是有调用限制的,即使提升额度,小程序量级稍微大一些,都是吃不消的。


            3:未来云开发可能收费,云函数亦可能会成为云开发收费项目,例如云函数调用次数,使用带宽/流量,消耗资源,都是可计费项目。


            4:慢,云函数本身速度不快,在此基础上做转发请求,体验会很差

    2018-12-05
    有用 1
    回复 1
    • 洋葱头
      洋葱头
      2018-12-05

      1:云开发从2.2.3基础库才开始支持。

      ----

      通过配置 cloud:true 可以做到所有的客户端支持


       2:额度不足,如果把所有请求都用云函数来转发调用,那平均一个用户一天的调用次数非常多,而云函数是有调用限制的,即使提升额度,小程序量级稍微大一些,都是吃不消的。

      ----

      目前发邮件申请的话,基本配额是无限的


      3:未来云开发可能收费,云函数亦可能会成为云开发收费项目,例如云函数调用次数,使用带宽/流量,消耗资源,都是可计费项目。

      ----

      我们会尽量做到便宜


      4:慢,云函数本身速度不快,在此基础上做转发请求,体验会很差

      ----

      是的,现在性能是很有问题,优化马上就要上了,相信应该会快很多。



      2018-12-05
      5
      回复
  • 半寸灰
    半寸灰
    2018-12-04


    云函数 一直都不用配置  的    一直的都可以访问外网的,

    支持用云函数做代理什么  的       速度很慢的    云函数本身就很慢   调用次数还有限制。

    所以并没有多少人用这功能   实在 太慢了

    并不是什么bug。




    2018-12-04
    有用 1
    回复 1
    • 再见,电脑崽
      再见,电脑崽
      2018-12-04

      的确是这样的,不过限制好像可以申请上调,具体规则不明。

      2018-12-04
      回复
  • 2018-12-03

    如果要配置,云函数就很鸡肋了

    2018-12-03
    有用 1
    回复
  • 大树
    大树
    2020-04-27

    是可以绕过域名限制 但是局域网ip还是请求不了 除非用微信的wx.request

    2020-04-27
    有用
    回复 4
    • 再见,电脑崽
      再见,电脑崽
      2020-04-27
      局域网?你做个小程序,自己用的吗? 动态域名解析了解一下。
      2020-04-27
      回复
    • 大树
      大树
      2020-04-27回复再见,电脑崽
      不是 用户端需要添加个自己的局域网ip  我这边来做代理请求
      2020-04-27
      回复
    • 再见,电脑崽
      再见,电脑崽
      2020-04-27回复大树
      你始终要经过路由才能转发
      2020-04-27
      回复
    • 大树
      大树
      2020-04-27回复再见,电脑崽
      所以只能用wx.request来做了
      2020-04-27
      回复
  • 晓峰
    晓峰
    2018-12-25

    get 如何实现?

    2018-12-25
    有用
    回复 2
    • 再见,电脑崽
      再见,电脑崽
      2018-12-25

      method: 'GET',

      2018-12-25
      回复
    • 晓峰
      晓峰
      2018-12-26

      有微信或者QQ没有,请教下!

      2018-12-26
      回复
  • 王政娇
    王政娇
    2018-12-05


    复制粘贴你的代码不知道为什么报错了

    2018-12-05
    有用
    回复 1
    • 日拱一卒
      日拱一卒
      2019-04-19

      我也出现过类似的错误!

      我的请求是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)

      }

      })

      })

      },

      ...

      2019-04-19
      回复
  • 亮🎩Allen
    亮🎩Allen
    2018-12-05

    是不是很惊喜

    2018-12-05
    有用
    回复
  • 2018-12-05

    这个早就发现了,不是bug,因为云函数有调用次数限制,用云函数做代理基本行不通。十几个用户就撑死了。+

    2018-12-05
    有用
    回复

正在加载...

登录 后发表内容