Python 使用Azure函数将URL和参数重定向到另一个HTTP服务器)Py)
我一直在努力编写一个Azure函数,它可以执行以下操作: 客户端/浏览器向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中的每一个创建单独的函数(每个函
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转发到辅助服务器、接收输出并将其发送回客户端的最佳方式有何指导?