You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:42:12