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

Smu*_*mug 8 powershell invoke-webrequest azure-rest-api invoke-restmethod

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

原因是什么?

网址

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

带有 $expand 的 URL

$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"
Run Code Online (Sandbox Code Playgroud)

调用 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}
Run Code Online (Sandbox Code Playgroud)

调用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"}
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 10

问题:

  • 只是显示问题,

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

简而言之:

  • 数据存在于输出中Invoke-RestMethod,只是似乎丢失了 - 请参阅下一节。
  • 使用$output.properties.dailyRecurrence它来查看它,或者为了更有效地可视化输出,使用它$output | ConvertTo-Json来将其重新转换为(美化的)JSON。
    • 注意:根据情况,您可能需要添加一个-Depth参数来完全表示深度大于 2 的对象图 - 请参阅这篇文章

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

您将看到生成的对象图的默认格式,它并不真正适合可视化嵌套 [pscustomobject]实例,这些实例由它们的.ToString()值表示 - 因此 - 由于错误 - 可能看起来没有值,即使它们有值。

相比之下,由于 的输出Invoke-WebRequest在其输出对象的属性中按原样报告 JSON 文本.Content,因此问题不会在那里出现。

该错误的简单演示:

[pscustomobject] @{ 
  nested = 
    [pscustomobject] @{ 
      deep = 
        [pscustomobject] @{ 
          deepest = 'down'
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

从 PowerShell Core 7.3.3 开始,这会产生以下结果,错误地表明.nested.deep没有价值,尽管它显然有:

nested
------
@{deep=}
Run Code Online (Sandbox Code Playgroud)