Mar*_*ndl 3 rest powershell encoding json azure
我使用该命令在 Azure API 管理中创建用户,但遇到了包含德语元音变音az rest
的用户名问题(例如 \xc3\xa4、\xc3\xb6、\xc3\xbc)。该脚本将创建用户,但名称包含无效字符。这里有一个例子:
这就是我创建用户的方式。由于一些带有双引号的 PowerShell / AZ 问题,我确实将用户写入文件中,并将其传递给 az cli:
\n@{\n properties = @{\n confirmation = "invite"\n firstName = "Max"\n lastName = "M\xc3\xbcstermann"\n email = "max.mustermann@stackoverflow.com"\n appType = "developerPortal"\n }\n } | ConvertTo-Json -Compress | Out-File $tmpFile -Encoding UTF8\n
Run Code Online (Sandbox Code Playgroud)\n这就是我将文件传递到 cli 的方式:
\naz rest --method put --uri $uri --body @$tmpFile\n
Run Code Online (Sandbox Code Playgroud)\n\n我已经尝试添加charset=utf-8
- 但它不能解决问题。有任何想法吗?
可怕的解决方法
\n我在这里重现了您的问题,到目前为止,我让它工作的唯一方法是将其替换\xc3\xbc
为 json unicode 转义序列:
$data = @{\n properties = @{\n confirmation = "invite"\n firstName = "Max"\n lastName = "M\xc3\xbcstermann"\n email = "max.mustermann@example.org"\n appType = "developerPortal"\n }\n}\n$json = $data | ConvertTo-Json -Compress;\n# vvvvvvvvvvvvvvvvvvvvvv\n$json = $json.Replace("\xc3\xbc", "\\u00FC"); # <----- replace \xc3\xbc with escape sequence\n# ^^^^^^^^^^^^^^^^^^^^^^\nSet-Content -Path $tmpfile -Value $json;\n\n$requestUri = "https://management.azure.com/" +\n "subscriptions/$subscriptionId/" +\n "resourceGroups/$resourceGroupName/" +\n "providers/Microsoft.ApiManagement/" +\n "service/$serviceName/" +\n "users/$username" +\n "?api-version=2019-12-01";\n\naz rest --method put --uri $requestUri --body @$tmpFile\n
Run Code Online (Sandbox Code Playgroud)\n这使:
\n\n我知道这不是一个非常令人满意的解决方案,因为它不能解决所有非 ASCII 字符的一般情况,而且您正在使用转换后的 json 进行修改,这可能会在奇怪的边缘情况下破坏事物。
\n一种极端的选择可能是编写自己的 json 序列化程序来转义适当的字符 - 我并不是说这是一个好主意,但它可能会起作用。如果您考虑沿着这条路线走下去,这里是我不久前为一个非常利基的用例编写的原始 PowerShell 序列化器,您可以将其用作起点并调整字符串序列化代码以转义适当的字符 - ConvertTo-OctopusJson。 PS1
\n希望这足以解除您的障碍,或者至少给您提供考虑的选择......
\n更多信息
\n对于调查此问题的其他人,这里有一些提示:
\naz
如果设置以下环境变量,则可以通过 Fiddler 发送请求::: /sf/ask/1435042941/\nset HTTPS_PROXY=https://127.0.0.1:8888\n\n:: /sf/ask/3882459451/\nset ADAL_PYTHON_SSL_NO_VERIFY=1\nset AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1\n
Run Code Online (Sandbox Code Playgroud)\n--body @$tmpfile
参数没有将文件作为二进制 blob 发送。相反,它以文本形式读取文件并将其重新编码为 ISO-8859-1(HTTP 的默认编码)。例如,如果文件是 UTF8 编码的,\xc3\xbc
表示为C3 BC
:文件内容仍会转换为 ISO-8859-1 编码,\xc3\xbc
表示为发送 HTTP 请求FC
时:az
其中\xc3\xaf\xc2\xbf\xc2\xbd
( EF BF BD
) 是 Unicode“替换字符”的 UTF8 表示形式:
FC
为\xc3\xbc
,并用“REPLACMENT CHARACTER”替换它,最后将响应编码为 UTF8。这可以模拟如下:
\n:: https://stackoverflow.com/questions/20500613/how-to-set-a-proxy-for-the-azure-cli-command-line-tool\nset HTTPS_PROXY=https://127.0.0.1:8888\n\n:: https://stackoverflow.com/questions/55463706/ssl-handshake-error-with-some-azure-cli-commands\nset ADAL_PYTHON_SSL_NO_VERIFY=1\nset AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1\n
Run Code Online (Sandbox Code Playgroud)\n这似乎与屏幕截图中的字节匹配,因此看起来这可能是 Azure API 管理 API 中的错误。
\n 归档时间: |
|
查看次数: |
1333 次 |
最近记录: |