az rest
명령을 사용하여 Azure API Management 내에서 사용자를 만들고 독일어 움라우트 (예 : ä, ö, ü) 가 포함 된 사용자 이름에 문제가 있습니다 . 스크립트는 사용자를 생성하지만 이름에 잘못된 문자가 포함되어 있습니다. 다음은 예입니다.
이것이 내가 사용자를 만드는 방법입니다. 큰 따옴표가있는 일부 PowerShell / AZ 문제로 인해 파일에 사용자를 작성하고 az cli에 전달합니다 .
@{
properties = @{
confirmation = "invite"
firstName = "Max"
lastName = "Müstermann"
email = "[email protected]"
appType = "developerPortal"
}
} | ConvertTo-Json -Compress | Out-File $tmpFile -Encoding UTF8
이것은 파일을 cli에 전달하는 방법입니다.
az rest --method put --uri $uri --body @$tmpFile
이미 헤더를 추가하려고했지만 charset=utf-8
문제가 해결되지 않았습니다. 어떤 아이디어?
끔찍한 해결 방법
여기에서 문제를 재현했으며 지금까지 작동하는 유일한 방법 ü
은를 json 유니 코드 이스케이프 시퀀스 로 바꾸는 것 입니다.
$data = @{
properties = @{
confirmation = "invite"
firstName = "Max"
lastName = "Müstermann"
email = "[email protected]"
appType = "developerPortal"
}
}
$json = $data | ConvertTo-Json -Compress;
# vvvvvvvvvvvvvvvvvvvvvv
$json = $json.Replace("ü", "\u00FC"); # <----- replace ü with escape sequence
# ^^^^^^^^^^^^^^^^^^^^^^
Set-Content -Path $tmpfile -Value $json;
$requestUri = "https://management.azure.com/" +
"subscriptions/$subscriptionId/" +
"resourceGroups/$resourceGroupName/" +
"providers/Microsoft.ApiManagement/" +
"service/$serviceName/" +
"users/$username" +
"?api-version=2019-12-01";
az rest --method put --uri $requestUri --body @$tmpFile
다음을 제공합니다.
모든 비 ASCII 문자의 일반적인 경우를 해결하지 못하기 때문에 그다지 만족스럽지 않은 솔루션이 아니라는 것을 알고 있습니다. 변환 된 json을 사용하여 이상한 경우에 문제를 일으킬 수 있습니다.
한 가지 극단적 인 옵션은 적절한 문자를 이스케이프하는 자체 json 직렬 변환기를 작성하는 것입니다. 좋은 생각은 아니지만 잠재적으로 작동 할 것입니다. 이 경로를 따라가는 것에 대해 생각한다면 여기에 아주 틈새 유스 케이스를 위해 얼마 전에 작성한 원시 PowerShell 직렬 변환기가 있습니다. 이는 시작점으로 사용할 수 있고 문자열 직렬화 코드를 조정하여 적절한 문자를 이스케이프합니다 -ConvertTo-OctopusJson.ps1
차단을 해제하거나 최소한 생각할 수있는 옵션을 제공하기에 충분할 수 있습니다.
더 많은 정보
이 문제를 조사하는 다른 사람을위한 몇 가지 지침은 다음과 같습니다.
az
다음 환경 변수를 설정하면 Fiddler를 통해 요청을 보낼 수 있습니다 .:: https://stackoverflow.com/questions/20500613/how-to-set-a-proxy-for-the-azure-cli-command-line-tool
set HTTPS_PROXY=https://127.0.0.1:8888
:: https://stackoverflow.com/questions/55463706/ssl-handshake-error-with-some-azure-cli-commands
set ADAL_PYTHON_SSL_NO_VERIFY=1
set AZURE_CLI_DISABLE_CONNECTION_VERIFICATION=1
--body @$tmpfile
매개 변수 가 파일을 이진 blob으로 보내지 않는 것 같습니다 . 대신 파일을 텍스트로 읽고 ISO-8859-1 (HTTP의 기본 인코딩)로 다시 인코딩합니다. 파일은 예를 들어 함께 인코딩 UTF8 ü
로 표현 C3 BC
:파일 내용 은 HTTP 요청을 보낼 때 와 같이 ü
표현 된 ISO-8859-1 인코딩으로 계속 변환됩니다 .FC
az
여기서 �
( EF BF BD
)는 유니 코드 " REPLACEMENT CHARACTER " 의 UTF8 표현입니다 .
FC
로 디코딩하는 데 실패 ü
하고 대신 "REPLACEMENT CHARACTER"로 대체하고 마지막으로 응답을 UTF8로 인코딩합니다.다음과 같이 시뮬레이션 할 수 있습니다.
# client sends request encoded with iso-8859-1
$requestText = "Müstermann";
$iso88591 = [System.Text.Encoding]::GetEncoding("iso-8859-1");
$requestBytes = $iso88591.GetBytes($requestText);
write-host "iso-8859-1 bytes = '$($requestBytes | % { $_.ToString("X2") })'";
# iso-8859-1 bytes = '4D FC 73 74 65 72 6D 61 6E 6E'
# server decodes request with utf8 instead
$utf8 = [System.Text.Encoding]::UTF8;
$mangledText = $utf8.GetString($requestBytes);
write-host "mangled text = '$mangledText'";
# mangled text = 'M�stermann'
# server encodes the response as utf8
$responseBytes = $utf8.GetBytes($mangledText);
write-host "response bytes = '$($responseBytes | % { $_.ToString("X2") })'";
# response bytes = '4D EF BF BD 73 74 65 72 6D 61 6E 6E'
스크린 샷의 바이트와 일치하는 것 같으므로 Azure API Management API의 버그 일 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다