如何在while循环中附加Web请求结果

问题描述 投票:0回答:1

我需要调用一个API并循环遍历返回的各个结果页面并将它们全部附加到一个对象。

我试过下面的代码。通常+=在附加到powershell对象时起作用,但这次没有运气。

注意:URIGet都是其他地方定义的函数。它们在代码中的其他位置按预期工作。

$min=1
$max=2

while ($min -le $max){
    $url= URI "tasks?page=$min"
    $x=Get $url
    if($min=1){
        $response=$x
    }
    else{
        $response+=$x
    }

    $min=$min+1
}

样本响应(转换为json):

  "value": [
    {
      "task_id": 17709655,
      "project_id": 1928619,
      "start_date": "2019-04-11",
      "end_date": "2019-11-29",
      "start_time": null,
      "hours": 1.5,
      "people_id": 17083963,
      "status": 2,
      "priority": 0,
      "name": "",
      "notes": "",
      "repeat_state": 0,
      "repeat_end_date": null,
      "created_by": 331791,
      "modified_by": 0,
      "created": "2019-04-12 00:39:30.162",
      "modified": "2019-04-12 00:39:30.162",
      "ext_calendar_id": null,
      "ext_calendar_event_id": null,
      "ext_calendar_recur_id": null
    },
    {
      "task_id": 17697564,
      "project_id": 1928613,
      "start_date": "2019-10-08",
      "end_date": "2019-10-08",
      "start_time": null,
      "hours": 8,
      "people_id": 17083966,
      "status": 2,
      "priority": 0,
      "name": "",
      "notes": "",
      "repeat_state": 0,
      "repeat_end_date": null,
      "created_by": 327507,
      "modified_by": 0,
      "created": "2019-04-11 16:10:22.969",
      "modified": "2019-04-11 16:10:22.969",
      "ext_calendar_id": null,
      "ext_calendar_event_id": null,
      "ext_calendar_recur_id": null
    }
  ],
  "Count": 2
}```

powershell webrequest
1个回答
0
投票

假设您希望输出为数组,我会像这样编写代码:

$min=1
$max=2

$response = foreach ($Page in $min..$max) {
    $url = URI "tasks?page=$Page"
    Get $url
}

这是通常首选的方法,因为字符串和数组在.Net中都有固定的长度,因此PowerShell也是如此。

在这里,$response[0]应该是第一个响应,$response[1]应该是第二个,等等。

如果以上对您不起作用,那么我的第一个猜测就是Get的输出不是字符串。

如果您期望$response是包含所有响应的单个有效JSON字符串,那么我的响应是“JSON不能以这种方式工作”。您必须解析每个对象的JSON响应(提示:ConvertFrom-Json),然后将它们转换回JSON(ConvertTo-Json)。请注意.Net的JSON本地方言与互联网的JSON方言的其他方言不匹配,尤其是日期(尽管看起来这里的日期是字符串)。你可能想使用JSON.Net,我认为它确实与普通的互联网方言相匹配。

你可以像这样结合$response

$CombinedResponse = '[' + ($response -join ',') + ']'

但是,如果您尝试将其解析为JSON,我不知道它会有多好用。

© www.soinside.com 2019 - 2024. All rights reserved.