PowerShell Invoke-RestMethod Body如何实现变量传参并保持结构
PowerShell 动态构造Invoke-RestMethod Body参数实现方案
PowerShell 单引号包裹的字符串为字面量,不会解析内部$开头的变量,要保留原有JSON结构对接Panorama设备,可选择以下两种实现方式:
方案1:对象序列化构造(优先推荐,无格式错误风险)
手动拼接JSON字符串容易出现引号转义错误、数组格式异常问题,最稳妥的方式是先构造和目标JSON结构完全匹配的PowerShell对象,再序列化为JSON字符串,原有$param的其他配置项完全不需要改动。
# 构造与目标JSON结构一致的对象 $payload = @{ entry = @( @{ '@name' = $HubAddressObject static = @{ member = $ArrayList } } ) } $param = @{ # 此处保留你原有$param里的所有配置,比如Uri、Method、Headers、认证参数等 Body = $payload | ConvertTo-Json -Depth 10 -Compress # 剩余原有配置... } # 正常调用接口即可 Invoke-RestMethod @param
注意:PowerShell默认ConvertTo-Json的序列化深度为2,会将嵌套层级较深的对象截断,指定-Depth 10可覆盖Panorama接口需要的结构深度;如果$ArrayList是数组类型,序列化时会自动转换为JSON标准数组格式,无需手动拼接成员。
方案2:双引号转义拼接(兼容原有字符串写法)
如果需要保留直接写Body字符串的编码习惯,可将外层单引号替换为双引号,对JSON内部的所有双引号用反引号`转义,数组变量提前序列化为JSON数组格式的字符串即可。
# 提前将数组处理为JSON要求的"值1","值2"格式 $memberContent = $ArrayList | ForEach-Object { "`"$_`"" } | Join-String -Separator ',' $param = @{ # 此处保留你原有$param里的所有配置 Body = "{`"entry`":[{`"@name`":`"$HubAddressObject`",`"static`":{`"member`":[$memberContent]}}]}" # 剩余原有配置... }
注意:该方案如果变量内容包含双引号、反斜杠等JSON特殊字符,会导致Body格式非法,接口调用失败,非必要场景优先选择方案1。
调用前可直接输出$param.Body核对结构,确认和预期JSON格式完全一致再发起请求即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

