我需要调用一个API并循环遍历返回的各个结果页面并将它们全部附加到一个对象。
我试过下面的代码。通常+=
在附加到powershell对象时起作用,但这次没有运气。
注意:URI
和Get
都是其他地方定义的函数。它们在代码中的其他位置按预期工作。
$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
}```
假设您希望输出为数组,我会像这样编写代码:
$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,我不知道它会有多好用。