Invoke-WebRequest 和 Invoke-RestMethod 的不同结果

Different results from Invoke-WebRequest and Invoke-RestMethod

我正在尝试调用 Azure Rest API 并获取 DevTestLabs 的时间表。我尝试了 Invoke-RestMethod,但它没有在 "dailyRecurrence" 键上给出 value。但是 Invoke-WebRequest 可以。

这是什么原因?

URL

$url = "https://management.azure.com/subscriptions/{subscriptionID}/resourceGroups/{resourseGroup}/providers/Microsoft.DevTestLab/labs/{LabName}/schedules/LabVmsShutdown?api-version=2018-10-15-preview"

URL 和 $expand

$url = "https://management.azure.com/subscriptions/{subscriptionID}/resourceGroups/{resourseGroup}/providers/Microsoft.DevTestLab/labs/{LabName}/schedules/LabVmsShutdown?$expand=properties(dailyRecurrence)&api-version=2018-10-15-preview"

调用 Invoke-RestMethod

$output = Invoke-RestMethod -Uri $url -Method "GET" -ContentType "application/json" -Headers $authHeaders

properties : @{status=Enabled; taskType=LabVmsShutdownTask; dailyRecurrence=; timeZoneId=AUS Eastern Standard Time;
         notificationSettings=; createdDate=26/03/2019 4:38:18 PM; provisioningState=Succeeded;
         uniqueIdentifier=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}

正在调用 Invoke-WebRequest

$output = Invoke-WebRequest -Uri $url -Method "GET" -Headers $authHeaders

Content           : {"properties":{"status":"Enabled","taskType":"LabVmsShutdownTask","dailyRecurrence":{"time":"1900"}
                ,"timeZoneId":"AUS Eastern Standard Time","notificationSettings":{"status":"Disabled","timeInMinute
                s":30},"createdDate":"2019-03-26T03:38:18.0726376+00:00","provisioningState":"Succeeded","uniqueIde
                ntifier":"XXXXXXXXXXXXXXXXXXXXXXXXX"},"id":"/subscriptions/XXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXX/providers/microsoft.devtestlab/labs/XXXXXXXX/schedules/labvmsshutdown","name":"LabVmsShutdown","type":"microsoft.devtestlab/labs/schedules","location":"australiasoutheast"}

问题:

  • 只是一个显示问题,

  • 尽管它暴露了一个长期存在的 bug,但从 PowerShell Core 7.2.0-rc.1 开始仍然存在,即 [pscustomobject] 实例错误地字符串化为 空字符串 - 请参阅 GitHub issue #6163.

简而言之:

  • 数据 Invoke-RestMethod 输出中,只是 看起来 丢失了 - 请参阅下一节。
  • 使用 $output.properties.dailyRecurrence 查看它,或者为了更有帮助地可视化输出,使用它 $output | ConvertTo-Json 将其重新转换为(美化)JSON。
    • 注意:在某些情况下,您可能必须添加 -Depth 参数才能完全表示深度大于 2 的对象图 - 请参阅

Invoke-RestMethod - 与 Invoke-WebRequest 不同 - 具有 内置反序列化 :带有 JSON响应,它会自动解析返回到 [pscustomobject] 图中的 JSON 文本,就好像 ConvertFrom-Json 已应用于它。

您看到的是生成的对象图的默认格式,这并不真正适合可视化 嵌套 [pscustomobject] 实例,它们由 [= =23=] 值 - 因此 - 由于错误 - 可能 看起来 没有价值,即使它们确实如此。

相比之下,由于 Invoke-WebRequest 的输出在其输出对象的 .Content 属性 中按原样报告 JSON 文本,因此问题并不存在浮出水面

错误的简单演示:

[pscustomobject] @{ 
  nested = 
    [pscustomobject] @{ 
      deep = 
        [pscustomobject] @{ 
          deepest = 'down'
        } 
    } 
}

从 PowerShell Core 7.2.0-rc.1 开始,这会产生以下内容,错误地暗示 .nested.deep 没有价值,尽管它显然有:

nested
------
@{deep=}