Azure Function中Invoke-RestMethod含德语特殊字符时调用失败求助
解决Linux环境下PowerShell Azure函数调用DevOps Pipeline时德语特殊字符导致的请求体损坏问题
问题根源
手动拼接JSON字符串时,德语特殊字符(Ü、Ö、Ä等)的转义或编码处理不符合JSON规范,加上Linux环境下PowerShell的字符串编码差异,导致服务端无法正确解析请求体,抛出runParameters为空的异常。
解决方案:避免手动拼接JSON,使用ConvertTo-Json生成标准JSON
手动拼接JSON极易出现格式错误和编码问题,改用PowerShell的对象序列化功能生成JSON,能自动处理特殊字符转义和UTF-8编码。
修改后的代码示例:
# 初始化请求头 $headers = [System.Collections.Generic.Dictionary[string,string]]::new() $headers.Add("Content-Type", "application/json; charset=utf-8") $headers.Add("Authorization", "Basic $secret") # 构造请求体对应的对象(而非手动拼接字符串) $requestBody = [PSCustomObject]@{ templateParameters = [PSCustomObject]@{ items = $items } } # 将对象序列化为标准JSON,-Depth确保嵌套结构被正确序列化 $body = $requestBody | ConvertTo-Json -Depth 10 # 发起请求 $response = Invoke-RestMethod 'https://dev.azure.com/<repos>/<project>/_apis/pipelines/1/runs?api-version=7.0' -Method 'POST' -Headers $headers -Body $body
额外优化:直接传递UTF-8编码的字节数组
如果仍存在编码问题,可以将JSON字符串转换为UTF-8字节数组后传递,彻底避免编码转换差异:
$bodyBytes = [System.Text.Encoding]::UTF8.GetBytes($body) $response = Invoke-RestMethod 'https://dev.azure.com/<repos>/<project>/_apis/pipelines/1/runs?api-version=7.0' -Method 'POST' -Headers $headers -Body $bodyBytes -ContentType 'application/json; charset=utf-8'
关键说明
ConvertTo-Json会严格按照JSON规范处理特殊字符、嵌套结构,确保服务端能正确解析请求体。- 手动拼接JSON时,即使
Write-Host显示字符正确,也可能存在不可见的格式错误或编码问题,导致服务端解析失败。
内容的提问来源于stack exchange,提问作者user0987654321
相关产品推荐
相关产品推荐

