首页 > 解决方案 > 在 Powershell 中动态使用数组值作为 API POST 参数

问题描述

我正在尝试创建一个 API 来使用 powershell 创建天蓝色组,但我遇到了一些死胡同。我需要动态创建多个组,每个组具有不同的成员,但似乎我不能只将数组传递给 API 请求正文。每个数组值都应该用双引号括起来,如下所示:

$membersArray = "johnp.com","RIF@gmail.com", "aao@gmail.com", "imz@gmail.com"
Write-Host "$($membersArray)"
[string[]]$testArr ="allen@gmailcom", "JohnMartin@gmail.com"
$Method="Post"
$Header = @{"content-type"="application/json";
"Authorization"="Bearer $token"}
$Body =@"
{
    "Tenant":"organization.onmicrosoft.com",
    "Group": "TEST_GROUP_MADE_BY_ALLEN7",
    "ApplicationId" : "", 
    "DelegatedServiceId": "",
    "Owners":["$($testArr[0])", "$($testArr[1])"],
    "Members": ["$($membersArray)"],
    "Description":"test can be deleted for group creation",
    "ResultFormat": "json"
}
"@

$Result =Invoke-WebRequest -Uri $URL -Method $Method -Headers $Header -Body $Body 
$result.RawContent
$Result.StatusCode

我已经编辑了 URL 端点和正确的租户名称,因为这是我的公司工作,这是我的测试脚本,然后将其应用到我创建的从 csv 文件中获取输入数据的循环。

如果我们打印出 $Body 变量,我们将得到:

Write-Host "$Body" 
{
    "Tenant":"organization.onmicrosoft.com",
    "Group": "TEST_GROUP_MADE_BY_ALLEN7",
    "ApplicationId" : "", 
    "DelegatedServiceId": "",
    "Owners":["allen@gmailcom", "JohnMartin@gmail.com"],
    "Members": ["johnp.com RIF@gmail.com aao@gmail.com imz@gmail.com"],
    "Description":"test can be deleted for group creation",
    "ResultFormat": "json"
}

如果我们查看 $Body 对象的成员参数,数组值没有用双引号和逗号分隔,例如:“arrayValue”、“arrayValue2”。

所以我的问题是:有没有办法在不使用 switch case 语句的情况下做到这一点,因为每个组的成员从 10 到 45 不等,如果我用 switch 语句强行这样做,它会使脚本完全不可读,并且可以在脚本开发中造成很多人为错误。任何帮助,将不胜感激。谢谢!

标签: powershellapidata-structures

解决方案


我似乎明白了。这部分代码将变量 $Body 设置为 JSON:

$Body =@"
{
    "Tenant":"organization.onmicrosoft.com",
    "Group": "TEST_GROUP_MADE_BY_ALLEN7",
    "ApplicationId" : "", 
    "DelegatedServiceId": "",
    "Owners":["$($testArr[0])", "$($testArr[1])"],
    "Members": ["$($membersArray)"],
    "Description":"test can be deleted for group creation",
    "ResultFormat": "json"
}
"@

因此,要修复它,您必须将 $Body 变量设置为普通哈希表,方法是删除{ 之前的 " 和右大括号 }@ 并以正确的语法设置值,如下所示:

$Body = @{    
    "Tenant"="organization.onmicrosoft.com"
    "Group"= "TEST_GROUP_MADE_BY_ALLEN8"
    "ApplicationId" = ""
    "DelegatedServiceId"= ""
    "Owners"= $testArr
    "Members"= $membersArray
    "Description"="test can be deleted for group creation"
    "ResultFormat"= "json"
    }

之后,我们必须创建另一个变量来保存 $body 的数据,然后将其转换为 Json,以便我们可以将其用作我们的 API Post Body,如下所示:

$JSON= $Body | ConvertTo-Json
#The result of this will be this:
Write-Host $JSON
#Result of Write-Host $JSON

{
    "Owners":  [
                   "allen@gmail.com",
                   "John@gmail.com"
               ],
    "ApplicationId":  "",
    "Group":  "TEST_GROUP_MADE_BY_ALLEN8",
    "DelegatedServiceId":  "",
    "ResultFormat":  "json",
    "Description":  "test can be deleted for group creation",
    "Members":  [
                    "john@gmail.com",
                    "RIF@gmail.com",
                    "aao@gmail.com",
                    "ilmz@gmail.com"
                ],
    "Tenant":  "organization.onmicrosoft.com"
}
#Just use it like so:

$Result =Invoke-WebRequest -Uri $URL -Method $Method -Headers $Header -Body $JSON
$Result.StatusCode 

然后我们可以在循环等中使用它来动态地使用数组作为 API 发布请求主体的参数。


推荐阅读