Azure CLI Rest 编码问题(德语变音符号)

Mar*_*ndl 3 rest powershell encoding json azure

我使用该命令在 Azure API 管理中创建用户,但遇到了包含德语元音变音az rest的用户名问题(例如 \xc3\xa4、\xc3\xb6、\xc3\xbc)。该脚本将创建用户,但名称包含无效字符。这里有一个例子:

\n

在此输入图像描述

\n

这就是我创建用户的方式。由于一些带有双引号的 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 的方式:

\n
az rest --method put --uri $uri --body @$tmpFile\n
Run Code Online (Sandbox Code Playgroud)\n

文件本身看起来不错:\n在此输入图像描述

\n

我已经尝试添加charset=utf-8- 但它不能解决问题。有任何想法吗?

\n

mcl*_*ton 7

可怕的解决方法

\n

我在这里重现了您的问题,到目前为止,我让它工作的唯一方法是将其替换\xc3\xbc为 json unicode 转义序列:

\n
$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

对于调查此问题的其他人,这里有一些提示:

\n
    \n
  • az如果设置以下环境变量,则可以通过 Fiddler 发送请求:
  • \n
\n
:: /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
    \n
  • 看起来该--body @$tmpfile参数没有将文件作为二进制 blob 发送。相反,它以文本形式读取文件并将其重新编码为 ISO-8859-1(HTTP 的默认编码)。例如,如果文件是 UTF8 编码的,\xc3\xbc表示为C3 BC
  • \n
\n

在此输入图像描述

\n

文件内容仍会转换为 ISO-8859-1 编码,\xc3\xbc表示为发送 HTTP 请求FC时:az

\n

在此输入图像描述

\n
    \n
  • 返回的响应如下:
  • \n
\n

在此输入图像描述

\n

其中\xc3\xaf\xc2\xbf\xc2\xbd( EF BF BD) 是 Unicode“替换字符”的 UTF8 表示形式:

\n

在此输入图像描述

\n
    \n
  • 我的猜测是客户端将正文作为 ISO-8859-1 发送,但服务器端将其视为 UTF8。服务器无法将 ISO-8859-1 字节解码FC\xc3\xbc,并用“REPLACMENT CHARACTER”替换它,最后将响应编码为 UTF8。
  • \n
\n

这可以模拟如下:

\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