使用VSTS REST API排队新构建时请求反序列化失败求助
解决VSTS Build API请求序列化错误问题
你的问题出在重复对JSON内容进行序列化上!让我帮你拆解一下:
错误原因分析
你原本的脚本里,$body已经是一个完整的JSON字符串了,但你在调用Invoke-RestMethod时又用了ConvertTo-Json $body——这会把这个JSON字符串再包装成一个JSON格式的字符串(相当于给整个JSON套了一层引号并转义内部字符),比如原本的{"definition":{"id":20}}会被转成"{\"definition\":{\"id\":20}}"。VSTS API收到的是一个字符串,而不是它期望的JSON对象,自然会抛出"无法反序列化"的错误。
修正方案:二选一即可
方案1:直接使用现成的JSON字符串作为请求体
去掉多余的ConvertTo-Json,直接把$body传给-Body参数:
Param( [string]$vstsAccount = "abc", [string]$projectName = "abc", [string]$user = "", [string]$token = "xyz" ) # Base64编码PAT $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token))) $verb = "POST" # 使用你抓取到的完整请求负载 $body = @" {"queue":{"id":70},"definition":{"id":20},"project":{"id":"b0e8476e-660a-4254-a100-92ef0ec255e5"},"sourceBranch":"refs/heads/master","sourceVersion":"","reason":1,"demands":[],"parameters":"{\"system.debug\":\"false\"}"} "@ $uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=4.1" # 注意这里直接用$body,不用ConvertTo-Json $result = Invoke-RestMethod -Uri $uri -Method $verb -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
方案2:用PowerShell对象构建请求体,再转成JSON(更推荐,便于维护)
如果后续需要修改参数,用PowerShell对象会更灵活,避免手动处理JSON转义:
Param( [string]$vstsAccount = "abc", [string]$projectName = "abc", [string]$user = "", [string]$token = "xyz" ) $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token))) $verb = "POST" # 构建PowerShell对象 $buildRequest = [PSCustomObject]@{ queue = @{ id = 70 } definition = @{ id = 20 } project = @{ id = "b0e8476e-660a-4254-a100-92ef0ec255e5" } sourceBranch = "refs/heads/master" sourceVersion = "" reason = 1 demands = @() parameters = '{"system.debug":"false"}' } # 把对象转成JSON字符串,指定足够深度避免嵌套截断 $body = $buildRequest | ConvertTo-Json -Depth 10 $uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=4.1" $result = Invoke-RestMethod -Uri $uri -Method $verb -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
验证要点
- 确保你的PAT拥有Build队列权限(至少是"队列构建"的权限)
- 确认
definition.id、queue.id和project.id都是目标项目中的有效ID - 检查请求头的
Authorization格式是否正确(Basic + Base64编码的user:PAT,user可以为空字符串)
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

