W***@163.com
W***@163.com
  • 发布:2022-04-12 14:05
  • 更新:2022-04-13 12:50
  • 阅读:1014

求unicloud.httpclient代理转发示例

分类:uniCloud

微前端需要基座应用代理请求至子应用

uniCloud.httpclient.request()有enableProxy参数可以开启代理转发
但折腾一上午还是没有实现,求一个示例学习!!

2022-04-12 14:05 负责人:无 分享
已邀请:
W***@163.com

W***@163.com (作者)

DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

enableProxy是对当前发送的request请求开启代理,虽然确实会把请求转发到目标服务器(代理服务器),但是应该不是你需要的。

下面这段代码大致能满足你的需求,你可以参考下。其中getSign部分的逻辑用户校验来源,如果你是客户端发起的请求这部分意义不大

'use strict';  
const crypto = require('crypto')  

const secret = 'secret demo'  

function getSign(timestamp) {  
  const hmac = crypto.createHmac('sha256', secret)  
  hmac.update('' + timestamp)  
  return hmac.digest('hex')  
}  

async function proxy(event) {  
  const {  
    url,  
    options,  
    timestamp,  
    sign  
  } = JSON.parse(event.body)  
  if (!timestamp || Math.abs(Date.now() - timestamp) > 600 * 1000) {  
    console.error('客户端时间与服务端差距过大')  
    throw new Error('invalid request')  
  }  

  if (!sign || sign !== getSign(timestamp)) {  
    console.error('sign校验未通过')  
    throw new Error('invalid request')  
  }  

  const res = await uniCloud.httpclient.request(url, {  
    followRedirect: true,  
    ...options  
  })  
  return {  
    mpserverlessComposedResponse: true,  
    isBase64Encoded: true,  
    statusCode: res.status,  
    headers: res.headers,  
    body: res.data.toString('base64')  
  }  
}  

exports.main = async (event, context) => {  
  try {  
    const res = await proxy(event)  
    return res  
  } catch (e) {  
    return {  
      mpserverlessComposedResponse: true,  
      isBase64Encoded: false,  
      statusCode: 500,  
      headers: {  
        'content-type': 'text/plain'  
      },  
      body: e.message  
    }  
  }  
};  
  • W***@163.com (作者)

    感谢感谢!!!

    2022-04-13 13:09

  • W***@163.com (作者)

    前辈我再次向您确定下思路:

    1 云函数url化

    2 客户端我使用的是ajax-hook和fetch-intercept分别拦截xhr和fetch请求,拦截后把将要发出的请求替换为url化的云函数。这样就在客户端调用了云函数。

    3 执行您上述的代码示例

    对于第二步我不是特别确定,总觉得serverless做代理转发这样操作不是很好的解法。想请教前辈这样操作是否正确。感谢!

    2022-04-24 10:49

  • DCloud_uniCloud_WYQ

    回复 W***@163.com: 你看能实现自己需求就行。云函数转发网络请求有个需要注意的是,云函数在实例不复用且未开启固定ip的情况下,出口ip是会变的。其他的跟你自己写个node服务转发没太大区别

    2022-04-27 16:22

  • W***@163.com (作者)

    回复 DCloud_uniCloud_WYQ: 谢谢前辈的解答!!

    2022-04-29 08:50

该问题目前已经被锁定, 无法添加新回复