Powershell ForEach调用rest方法
我试图向Cisco Prime API的AccessPointsDetails端点发出请求,然后通过该端点循环获取AccessPoints的所有URL对象,以便获取每个访问点的数据 我得到以下输出:Powershell ForEach调用rest方法,powershell,cisco,Powershell,Cisco,我试图向Cisco Prime API的AccessPointsDetails端点发出请求,然后通过该端点循环获取AccessPoints的所有URL对象,以便获取每个访问点的数据 我得到以下输出: VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3373245; $=3373245} VERBOSE: Making r
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3373245; $=3373245}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3413720; $=3413720}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3432295; $=3432295}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3432310; $=3432310}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3462672; $=3462672}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3497980; $=3497980}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3497993; $=3497993}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3512621; $=3512621}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/3526872; $=3526872}
VERBOSE: Making request to: @{@type=AccessPointDetails; @url=https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426; $=16162527426}
@type @url $
----- ---- -
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3373245 3373245
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3413720 3413720
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3432295 3432295
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3432310 3432310
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3462672 3462672
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3497980 3497980
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3497993 3497993
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3512621 3512621
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/3526872 3526872
AccessPointDetails https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426 16162527426
以下是一个商店的JSON响应:
{
"queryResponse": {
"@last": 9,
"@first": 0,
"@count": 10,
"@type": "AccessPointDetails",
"@requestUrl": "https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026",
"@responseType": "listEntityIds",
"@rootUrl": "https://cpist/webacs/api/v3/data",
"entityId": [
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3373245",
"$": "3373245"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3413720",
"$": "3413720"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3432295",
"$": "3432295"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3432310",
"$": "3432310"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3462672",
"$": "3462672"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3497980",
"$": "3497980"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3497993",
"$": "3497993"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3512621",
"$": "3512621"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3526872",
"$": "3526872"
},
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/16162527426",
"$": "16162527426"
}
]
}
}
我觉得我可能有点焦头烂额,犯了个愚蠢的疏忽
解决方案代码(见接受答案):
Function allAP {
Write-Verbose "Getting all APs for Store $Store"
$storeApReq = "https://cpist/webacs/api/v3/data/AccessPointDetails.json?.group=$Store"
Write-Verbose "Making request to $storeApReq"
$Global:apIdListReq = Invoke-RestMethod -uri $storeApReq -method Get -ContentType 'application/json' -headers @{ Authorization = $auth }
$Global:apIdList = $apIdListReq.queryResponse.entityId
$Global:apIdCount = $apIdListReq.queryResponse."@count"
Write-Verbose "Found $siteAPCount APs in Sites Database. $apIdCount out of $siteAPCount APs found."
Write-Verbose "Response Received: $apIdList"
$Global:apIdURL = $apIdListReq.queryResponse.entityId
$Global:apURL = $apIdUrl.'@url'
Write-Verbose "Starting a loop."
ForEach($apIdURL in $apIdList) {
Invoke-RestMethod -uri $apURL -method Get -ContentType 'application/json' -headers @{ Authorization = $auth }
Write-Verbose "Making request to: $apURL"
$apURL
}
}
您遇到的最大问题是错误地访问返回对象的成员。
Invoke RestMethod
返回应用程序返回给您的JSON的pscustomobject
表示。您的示例JSON如下所示:
{
"queryResponse": {
"@last": 9,
"@first": 0,
"@count": 10,
"@type": "AccessPointDetails",
"@requestUrl": "https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026",
"@responseType": "listEntityIds",
"@rootUrl": "https://cpist/webacs/api/v3/data",
"entityId": [
{
"@type": "AccessPointDetails",
"@url": "https://cpist/webacs/api/v3/data/AccessPointDetails/3373245",
"$": "3373245"
},
...
]
}
}
将其转换为pscustomobject
:
[pscustomobject]@{
'queryResponse' = [pscustomobject]@{
'@last' = 9
'@first' = 0
'@count' = 10
'@type' = 'AccessPointDetails'
'@requestUrl' = 'https://cpist/webacs/api/v3/data/AccessPointDetails?.group=0026'
'@responseType' = 'listEntityIds'
'@rootUrl' = 'https://cpist/webacs/api/v3/data'
'entityId' = @(
[pscustomobject]@{
'@type' = 'AccessPointDetails'
'@url' = 'https://cpist/webacs/api/v3/data/AccessPointDetails/3373245'
'$' = '3373245'
}
...
)
}
}
我不确定为什么访问“@url”
对您不起作用。下面是您尝试执行的工作实现
您的
@url
键正在返回另一个哈希表,因此您需要在它出现时更深一层。@TheIncorrigible1我该怎么做?让我快速发布JSON响应,因为我不确定是否可以更深入。这里:$Global:apidur=$apIdListReq.queryResponse.entityId。“@url”
。在您的foreach
访问apidur
中,执行$apidur['@url']
以访问正确的成员。请删除我的最后一条评论。我不知道您得到的是pscustomobject
而不是hashtable
。您需要改为执行$apidur.@url'
。您使用的是哪个版本的powershell?如果是v2,则您无法访问自动枚举,这是您的代码试图执行的操作,但似乎失败了。无论出于何种原因,我都会发布一个关于你的问题的答案,$apidur=$apIdListReq.queryResponse.entityId.@url'
,我必须创建另一个变量来添加'@url'
,我正在寻找一个好的解释。现在一切都好了,谢谢@你应该能够为每个对象执行$apIdListReq.queryResponse.entityId | MemberName'@url'
。-MemberName
是我要找的操作员,太棒了。使用此方法调用请求是不明智的,还是我应该创建一个单独的循环?@codepownedinvoke RestMethod
不将uri
对象数组作为参数,因此您仍然需要循环来针对所有端点运行请求。@codepowned因此我遗漏了代码中的一些关键内容。您正确地填充了URL
列表,但随后又通过再次查看原始entityId
对象来覆盖它Invoke RestMethod
是一个v3+cmdlet,因此您有自动枚举,这只是代码中的一个逻辑问题。
function Get-AccessPoint
{
param
(
[Parameter(Position = 0, Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$Store
)
# function is accessing above-scope variables $auth and $siteAPCount
Write-Verbose "Retrieving APs for store $Store"
$uri = "https://cpist/webacs/api/v3/data/AccessPointDetails.json?.group=$Store"
Write-Verbose "Request: $uri"
$global:apIdListReq = Invoke-RestMethod -Uri $uri -ContentType application/json -Headers @{Authorization = $auth}
$global:apIdList = $apIdListReq.queryResponse.entityId
$global:apIdCount = $apIdListReq.'@count'
Write-Verbose "Found $siteAPCount APs in Sites Database. $apIdCount out of $siteAPCount APs found."
foreach ($entity in $apIdList)
{
Write-Verbose "Making request to $($entity.'@url')"
Invoke-RestMethod -Uri $entity.'@url' -ContentType application/json -Headers @{Authorization = $auth}
}
}