PowerShell脚本调用Azure DevOps API添加发布变量报错:请求主体不能为空
解决Azure DevOps发布变量设置脚本报错"VS402865: POST请求不允许空主体"
你的脚本报错核心原因是:通过Add-Member给$releaseDefinition.variables添加变量的方式,导致后续ConvertTo-Json无法正确序列化整个对象,最终生成了无效的空JSON请求体,触发Azure DevOps API的错误。
修正方案
直接跳过多余的序列化/反序列化步骤,用更简洁的方式将变量添加到releaseDefinition.variables集合中:
- 替换原脚本中创建变量、序列化反序列化、添加成员的代码段,改为直接创建
PSCustomObject并赋值:
# 原问题代码段 # $newVariable = New-Object PSObject # $newVariable | Add-Member Noteproperty allowOverride $False # $newVariable | Add-Member Noteproperty isSecret $secretValue # $newVariable | Add-Member Noteproperty value $variableValue # $serializedVariable = $newVariable | ConvertTo-Json -Depth 3 # $deserializedVariable = $serializedVariable | ConvertFrom-Json # $releaseDefinition.variables | Add-Member -Name $variableName -Value $deserializedVariable -MemberType NoteProperty -Force # 修正后的代码 $newVariable = [PSCustomObject]@{ allowOverride = $False isSecret = $secretValue value = $variableValue } # 直接将变量赋值到variables集合,无需Add-Member $releaseDefinition.variables.$variableName = $newVariable
- 完整修正后的脚本:
$url = "https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/$releaseId?api-version=5.0" $releaseDefinition = Invoke-RestMethod -Uri $url -Method Get -Headers @{ "Authorization" = "Bearer $authenticationToken" "Content-Type" = "application/json; charset=utf-8" } $newVariable = [PSCustomObject]@{ allowOverride = $False isSecret = $secretValue value = $variableValue } $releaseDefinition.variables.$variableName = $newVariable $requestBody = ConvertTo-Json $releaseDefinition -Depth 100 $response = Invoke-RestMethod -Uri $url -Method Put -Headers @{ "Authorization" = "Bearer $authenticationToken" "Content-Type" = "application/json; charset=utf-8" } -Body $requestBody
原因说明
原脚本中先序列化再反序列化变量对象,再用Add-Member添加到variables的方式,会导致variables对象的类型结构出现兼容性问题,PowerShell的ConvertTo-Json在处理这类修改后的嵌套对象时,可能无法正确解析,最终生成空的或不符合API要求的JSON,触发"空请求体"错误。直接赋值PSCustomObject的方式能保证对象结构和原variables集合中的属性一致,序列化后生成的JSON符合Azure DevOps API的要求。
内容的提问来源于stack exchange,提问作者nhs
相关产品推荐
相关产品推荐

