PowerShell JSON Заголовки не конвертируются правильно - PullRequest
0 голосов
/ 09 марта 2020

Я использую вызов API REST, но проблема в том, что он по какой-то причине неправильно передает значение заголовка. Я получаю сообщение об ошибке, что он не конвертируется из "System.String" в "System.Collections.IDictionary". Код:

$Headers = New-Object 'System.Collections.Generic.Dictionary[[String],[String]]'

$Headers.Add('X-CENTRIFY-NATIVE-CLIENT', 'true')
$Headers.Add('Content-Type', 'application/json')

$Body = @{
    TenantId = 'ID'
    User = 'cloudadmin@andrew1.com'
    Version = '1.0' 
} 

#$wr = Invoke-WebRequest -Method Post -Uri $url -Headers $Headers -Body $Body -Verbose  

Invoke-RestMethod -Uri "https://uri/Security/StartAuthentication" -Method Post  -Headers ($Headers | ConvertTo-Json -Compress) -UseBasicParsing -Body $Body 

Но когда я выполняю, я получаю эту ошибку (FQID):

Invoke-RestMethod : Cannot bind parameter 'Headers'. Cannot convert the "{
    "X-CENTRIFY-NATIVE-CLIENT":  "true",
    "Content-Type":  "application/json"
}" value of type "System.String" to type "System.Collections.IDictionary".
At line:31 char:109
+ ... tication" -Method Post  -Headers ($Headers1 | ConvertTo-Json) -UseBas ...
+                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Invoke-RestMethod], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

Я также попробовал свои заголовки:

$headers = @{

    'Content-Type'= 'application/json'
    'X-CENTRIFY-NATIVE-CLIENT'= 'true'
}

Но я все еще получаю ту же ошибку. Странно, что он продолжает жаловаться на эту ссылку; Эта библиотека не является родной для Po SH. Есть ли DLL, которую я должен загрузить, или есть лучший способ go об этом?

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

Параметр -Headers ожидает словарь, не a json объект.

Передача $Headers напрямую:

$uri = "https://uri/Security/StartAuthentication"
Invoke-RestMethod -Uri $uri -Method Post -Headers $Headers -UseBasicParsing -Body $Body 

Вы можете проверить параметр детали с Get-Help:

PS > Get-Help Invoke-WebRequest -Parameter Headers

-Headers <IDictionary>

    Required?                    false
    Position?                    Named
    Accept pipeline input?       false
    Parameter set name           (All)
    Aliases                      None
    Dynamic?                     false
0 голосов
/ 09 марта 2020

Я взял преобразование json из заголовка вашего метода перезапуска вызова. Эта часть должна быть сделана для вашей полезной нагрузки $Body. Попробуйте это.

$Headers = @{}
$Headers.Add('X-CENTRIFY-NATIVE-CLIENT', 'true')
$Headers.Add('Content-Type', 'application/json')

$Body = @{
    TenantId = 'ID'
    User = 'cloudadmin@andrew1.com'
    Version = '1.0' 
} 

$Body = ($Body | ConvertTo-Json)

#$wr = Invoke-WebRequest -Method Post -Uri $url -Headers $Headers -Body $Body -Verbose  

Invoke-RestMethod -Uri "https://uri/Security/StartAuthentication" -Method Post -Headers $Headers -UseBasicParsing -Body $Body
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...