Python 使用Azure函数将URL和参数重定向到另一个HTTP服务器)Py)

Python 使用Azure函数将URL和参数重定向到另一个HTTP服务器)Py),python,function,azure-functions,Python,Function,Azure Functions,我一直在努力编写一个Azure函数,它可以执行以下操作: 客户端/浏览器向https://foo.azurewebsites.com/$A/$B。示例可能类似于http://foo.azurewebsites.com/john/30vjs0-s9fjs-fnsne $A=最多20个可能的字典单词中的一个 $B=未知字符串,但这些字符串也需要传递到辅助服务器 我想将整个HTTP请求(最好是GET和POST)重定向到另一个HTTP服务器(Az之外) 我知道我需要为$A中的每一个创建单独的函数(每个函

我一直在努力编写一个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函数模块中正确解析Python中的URL。我认为,正是处理$B中的未知变量导致了这个问题,因为我无法硬编码它们,因为我无法预测它们。Az函数当前不会传递与
/functionName
参数不完全匹配的任何内容-但在我的用例中,始终会有一个
$B

所以
https://foo.azurewebsites.com/john
将转发到我的会议服务器,但
https://foo.azurewebsites.com/john/test.txt
似乎正在被Az删除

我的Python在GET和POST上的转发在这里(对于$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},然后在Pythoninit.py中引用它,但没有成功(Az报告触发器url为
%7BURL%7B

我想一个关键问题是“这在Az函数上真的可能吗?在应用程序中,在函数名后传递参数,并使其能够在Python代码中引用?”


感谢您提供的任何帮助。

如果您希望将某些请求路径路由到同一个函数,您可以在
函数.json
中定义
路由

例如,我想将
https://{}/$A/$B
路由到同一个函数

{
  "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

您想将所有路径路由到函数吗?您好,如果我只有一个函数可以处理$A和$B的任何可能选项,那就行了。但是我想我需要单独的函数来处理$A的每个可能选项。因此,是的,我需要将所有路径路由到每个函数:/api/john/AnyPossibleString to该函数,对于/api/bob/AnyPossiblestring也是一样的,只需重新路由到辅助服务器即可。我想我的目标是在Azure函数中为HTTP流量提供一个几乎“socat”的哑重定向器:)如果它对您有用,可以吗?它可能会帮助更多有类似问题的人。您好-谢谢您的评论。我没有注意到,如果您有一个名为blahblah的函数,但使用{url}/{url1},它将在不调用我测试过的/blahblah/等的情况下路由,并且您需要有正确数量的{url}对象,如{url}/如果向函数发送了一个/foor/bar/test字符串,{url1}将出错。我认为您可以确保只使用已知数量的{url}。谢谢您回答了问题的这一部分:)您对将所有GET/POST转发到辅助服务器、接收输出并将其发送回客户端的最佳方式有何指导?