Azure Function PowerShell解析POST请求体失败问题求助
Azure Synapse触发PowerShell Azure Function无法解析POST Body字段
问题现象
从Azure Synapse触发PowerShell Azure Function时,POST请求Body中的字符串无法正确解析为对象,region和environment字段始终为空。
函数日志输出
2023-05-12T11:17:13Z [Information] INFORMATION: region: 2023-05-12T11:17:13Z [Information] INFORMATION: environment:
Synapse管道中Azure Function组件的输入配置
{ "functionName": "MyFunc", "method": "POST", "headers": {}, "body": "{environment: 'q', region: 'de', delta: 'true'}" }
Azure Function的PowerShell代码
using namespace System.Net param($Request) $request_body = $Request.Body | ConvertFrom-Json $region = $request_body.region $environment = $request_body.environment Write-Host "Loaded runtime config from request body." Write-Host "region: $region" Write-Host "environment: $environment"
本地测试结果(可正常解析)
PS > $a = "{environment: 'q', region: 'de', delta: 'true'}" PS > $b = $a | ConvertFrom-Json PS > $b environment region delta ----------- ------ ----- q de true PS > Write-Host $b.environment q
解决方案
方案1:修改Synapse的Body为标准JSON格式
标准JSON要求键名和字符串值都使用双引号,同时在Synapse的JSON配置中需要转义双引号:
{ "functionName": "MyFunc", "method": "POST", "headers": {}, "body": "{\"environment\": \"q\", \"region\": \"de\", \"delta\": \"true\"}" }
方案2:在PowerShell函数中兼容非标准JSON
如果无法修改Synapse的输入,可在函数中将请求体转为字符串后替换单引号为双引号,再进行解析:
using namespace System.Net param($Request) # 将请求体转为字符串,替换单引号为双引号以符合标准JSON格式 $request_body_str = $Request.Body.ToString() -replace "'", '"' $request_body = $request_body_str | ConvertFrom-Json $region = $request_body.region $environment = $request_body.environment Write-Host "Loaded runtime config from request body." Write-Host "region: $region" Write-Host "environment: $environment"
原因说明
本地PowerShell的ConvertFrom-Json对非标准JSON(单引号)有宽松支持,但Azure Function运行时依赖的.NET JSON解析器要求严格遵循JSON规范(必须使用双引号)。同时,Azure Function中的$Request.Body可能以流形式存在,而非直接字符串,需要先转换为字符串再处理。
内容的提问来源于stack exchange,提问作者Cribber
相关产品推荐
相关产品推荐

