首页 > 解决方案 > 使用 Azure 函数将 URL 和参数重定向到另一个 HTTP 服务器 )Py)

问题描述

我一直在尝试编写执行以下操作的 Azure 函数:

客户端/浏览器向https://foo.azurewebsites.com/$A/$B. 一个例子可能看起来像http://foo.azurewebsites.com/john/30vjs0-s9fjs-fnsne.

$A= 最多 20 个可能的字典单词之一。

$B= 未知字符串,但字符串也需要传递到辅助服务器。

我想将整个 HTTP 请求(理想情况下是 GET 和 POST)重定向到另一个 HTTP 服务器(在 Az 之外)。

我知道我需要为每个$A, (每个内部都有相同的代码)创建单独的函数,以将其重定向到另一个 HTTP 服务器。但是,我似乎无法弄清楚如何在 Az Functions 模块中的 Python 中正确解析 URL。它正在处理 $B 中的未知变量,这导致了我认为的问题,因为我无法对它们进行硬编码,因为我无法预测它们。Az Functions 当前不传递与/functionName参数不完全匹配的任何内容 - 但在我的用例中,总会有一个$B.

所以https://foo.azurewebsites.com/john将被转发到我的次要服务器,但https://foo.azurewebsites.com/john/test.txt似乎被 Az 丢弃了。

我要在 GET 和 POST 上转发的 Python 在这里(对 $A 列表中的每个函数重复):我一直在体验 GET 请求。

def main(req: func.HttpRequest) -> func.HttpResponse:
    if req.method == "GET":
        return get(req)
    if req.method == "POST":
        return post(req)

def post(req: func.HttpRequest) -> func.HttpResponse:
       
    header_dict = {}
    get_url = 'https://secondaryserver.com'
    for key, value in dict(req.headers).items():
        header_dict.update({key : value})
   
    post_data = req.get_body()
    request = urllib.request.Request(get_url, data=post_data, headers=header_dict)
    with urllib.request.urlopen(request) as response:
        html = response.read()
    return func.HttpResponse(html)


def get(req: func.HttpRequest) -> func.HttpResponse:
    suffix = req.url
    get_url = 'https://secondaryserver.com'
    final_url = get_url + suffix
    header_dict = {}
    print(final_url)
    for key, value in dict(req.headers).items():
        header_dict.update({key : value})
    request = urllib.request.Request(final_url, headers=header_dict)
    with urllib.request.urlopen(request) as response:
        html = response.read()
    return func.HttpResponse(html)

我还调查了 Microsoft 的这篇文章,在我的 function.json 中尝试 "route": {url} ,然后在 Python init .py 中引用它,但没有成功(Az 将触发 URLS 报告为%7BURL%7B

我想一个关键问题是'这在 Az Functions 上是否真的可行 - 在应用程序中的函数名称之后传递参数,并且能够在 Python 代码中引用?

感谢您提供的任何帮助。

标签: pythonfunctionazure-functions

解决方案


如果你想将一些请求路径路由到同一个函数,你可以routefunction.json. 更多详情,请参阅此处

例如。我想路由https://{}/$A/$B到相同的功能。我们应该定义function.json如下

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": ["get", "post"],
      "route": "{url}/{url1}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

测试

我的功能代码

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')
   

    
    return func.HttpResponse(
             req.url,
             status_code=200
        )

在此处输入图像描述 在此处输入图像描述

更新

如果要将请求转发到另一个HTTP服务器,可以参考以下代码

def main(req: func.HttpRequest) -> func.HttpResponse:
    if req.method == "GET":
        # send you request
    if req.method == "POST":
         # send you request

推荐阅读