对于针对 REST API 的单个 Web 会话,我尝试将所有不会更改的值捆绑到单个对象中,以便在函数之间传递并用于后续调用。
请记住,如果我将所有这些分开并将多个不同类型的对象发送到所有函数,那么这是可行的。只有当我尝试将所有常见的东西捆绑到一个对象中时,我才会遇到麻烦。
因此,我进行初始调用并捕获我需要的所有数据并将其填充到 $mySession 中:
$uriBase = "https://servername/api"
$uri = "$uriBase/therestof/theuri"
Invoke-RestMethod -Uri $uri -Method Put -contentType "application/json" -SessionVariable "Session" -Body $body
$headers = @{
'x-xsrf-token' = $XSRFTOKEN
'accept' = 'application/json'
'Cache-Control' = 'no-cache'
}
$mySession = [PSCustomObject]@{}
$mySession | Add-Member -MemberType NoteProperty -Name 'uriBase' -Value $uriBase
$mySession | Add-Member -MemberType NoteProperty -Name 'Session' -Value $Session
$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers
但是当我尝试使用这个时...
$uri = "$($mySession.uriBase)/another/uri"
$headers = $mySession.Headers
$Session = $mySession.Session
$rslt = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -contentType "application/json" -WebSession $Session
...我对对象类型有疑问。
| … t = Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -conten …
| ~~~~~~~~
| Cannot convert 'System.Object[]' to the type 'System.Collections.IDictionary' required by parameter 'Headers'. Specified method is not
| supported.
我尝试通过在存储之前转换 $headers 来适应这一点。
[System.Collections.IDictionary]$headers = @{
'x-xsrf-token' = $XSRFTOKEN
'accept' = 'application/json'
'Cache-Control' = 'no-cache'
}
...本身不会产生错误,但在调用
Invoke-RestMethod
时我仍然遇到相同的错误。
从对象中获取值,然后在使用它之前对其进行转换...
[System.Collections.IDictionary]$headers = $mySession.Headers
...产生错误消息:
| [System.Collections.IDictionary]$headers = $CognosSession.Headers
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| Cannot convert the "System.Object[]" value of type "System.Object[]" to type "System.Collections.IDictionary".
检查类型:
Write-Host $headers.GetType() | Format-List -Property *
...在两种情况下(有或没有强制转换)都告诉我 $headers 是一个
System.Collections.Hashtable
那么它是 System.Collections.Hashtable 还是 System.Object[]? (这是否意味着它是一个 System.Objects 数组?)
Add-Member
文档指出:
-类型名称
指定类型的名称。
该文档似乎对我没有多大帮助。 “……针对什么类型”?我认为这是针对会员类型的。所以我也尝试用这种方式选角:
$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers -TypeName 'System.Collections.IDictionary'
...这样...
$mySession | Add-Member -MemberType NoteProperty -Name 'Headers' -Value $headers -TypeName IDictionary
还是没有爱。
那么,我在这里做错了什么?我应该使用
PSCustomObject
和 Add-Member
以外的其他东西吗?
我花了一天时间与类似的事情作斗争——我发现了一些我不完全理解的 PS 打字行为。 (我是一名资深程序员,但 PS 新手。)
PowerShell 有时会在分配过程中以令人惊讶的方式更改对象类型。就我而言,在赋值之前初始化变量解决了问题。在你的情况下,也许这样的事情就能解决问题:
$headers = $null
# .. or $headers = @()
$headers = $mySession.Headers
如果这不起作用,请尝试
Write-Host $mySession.Headers.GetType
$headers = $mySession.Headers
Write-Host $headers.GetType
看看结果如何。
我很少用猜测来回答问题——但我花了很长时间研究我的问题,我希望我的研究可以为您节省几个小时。
就我而言,字符串中有一个意外的前导空格。我发现的大多数“解决方案”都是“use Trim()”的变体。这将使代码正常工作,但实际上并不能解决问题。广泛使用 GetType() 回答了很多问题。 (唉,它还创建了其他一些我仍在研究的内容。)
祝你好运!