python - 使用 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 代码中引用?
感谢您提供的任何帮助。
解决方案
如果你想将一些请求路径路由到同一个函数,你可以route
在function.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
推荐阅读
- angular - 通过添加数字并将结果显示给用户的 firebase 函数提交要运行的用户输入数字
- java - (IntelliJ GUI 设计器)将组件添加到 JPanel 时出现运行时 NullPointerException
- swift - 您将如何使用 .updateValue() 将子字典添加到 UserDefaults 字典?
- php - 用下划线替换 URL 中的空格
- node.js - 在adonis js中强制过期jwt令牌
- java - file.getName() 不返回任何内容
- python - 在保持变量的同时平均数据集?
- google-cloud-platform - 如何删除垃圾值并将多个 .csv 文件(不同的架构)加载到 BigQuery 中?
- python - 如果每个样本的特征形状是矩阵,如何使用 SVM 进行分类?是否只是将矩阵重塑为长向量?
- python - TypeError: Object dtype dtype('O') has no native HDF5 equivalent