【问题标题】:PowerShell JSON Headers not Converting correctlyPowerShell JSON 标头未正确转换
【发布时间】:2020-06-21 16:31:24
【问题描述】:

我正在使用 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'
}

但我仍然遇到同样的错误。奇怪的是它一直在抱怨这个引用。这个库不是 PoSH 原生的。是否有我应该加载的 DLL,或者有更好的方法来解决这个问题?

【问题讨论】:

  • 完全删除ConvertTo-Json,只做-Headers $Headers

标签: json powershell rest


【解决方案1】:

-Headers 参数需要一个字典,不是一个 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

【讨论】:

    【解决方案2】:

    我从您调用 restmethod 的标头中取出了 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
    

    【讨论】:

      猜你喜欢
      • 2020-02-13
      • 2018-12-08
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-21
      • 2021-07-18
      • 1970-01-01
      • 2017-11-10
      相关资源
      最近更新 更多