我正在尝试通过 API 向我们的 Azure Devops 服务器发出 Git 推送请求。地址为https://MYSITE.visualstudio.com/MYPROJECT/_apis/git/repositories/2b34d4f7-2c1f-42e7-8861-u0ba34f72b40/pushes?api-version=5.1正文如下:
{
"commits": [
{
"comment": "Just a dummy commit",
"changes": [
{
"changeType": "edit",
"item": {
"path": "/src/MYPROJECT/MYPROJECT.csproj"
},
"newContent": {
"content": "beans",
"contentType": "rawText"
}
}
]
}
],
"refUpdates": [
{
"name": "refs/heads/TestDummyPRs/upgradeProjectToLatest",
"oldObjectId": "058da4f3328cb1048cb43faf3b5158bc3b025615"
}
]
}
我收到以下错误:
Web Request Failed after 4 attempts. Request: https://MYSITE.visualstudio.com/MYPROJECT/_apis/git/repositories/2b34d4f7-2c1f-42e7-8861-u0ba34f72b40/pushes?api-version=5.1. Status: BadRequest. Response: Invalid status code [BadRequest]. Response: {"$id":"1","innerException":null,"message":"The parameters are incorrect. A posted push must contain exactly one commit and one refUpdate.\r\nParameter name: newPush","typeName":"Microsoft.TeamFoundation.SourceControl.WebServer.InvalidArgumentValueException, Microsoft.TeamFoundation.SourceControl.WebServer","typeKey":"InvalidArgumentValueException","errorCode":0,"eventId":0}
“发布的推送必须恰好包含一个提交和一个 refUpdate”似乎并不完全合理,因为这正是我体内的内容。有人知道这里会发生什么吗?
请注意,我在发出其他网络请求时没有遇到任何问题,例如创建分支或检索文件内容。
我希望我的网络请求能够顺利进行,并创建一个包含对指定 refUpdate 的指定提交的推送。
我通过 Azure Devops Web 界面进行了手动推送并捕获了网络流量,我从中获取了以下 JSON 请求:
{
"commits": [
{
"changes": [
{
"changeType": 2,
"item": {
"path": "/src/MYPROJECT/MYPROJECT.csproj"
},
"newContent": {
"content": "beans",
"contentType": 0
}
}
],
"comment": "Just a dummy commit"
}
],
"refUpdates": [
{
"name": ""refs/heads/TestDummyPRs/upgradeProjectToLatest",
"oldObjectId": "058da4f3328cb1048cb43faf3b5158bc3b025615"
}
]
}
除了枚举字段使用数值而不是文本之外,这似乎与我从我的代码中进行的推送有意义地相同。我已经用枚举的数值尝试了我的代码,但这并没有改变错误的任何内容。
我发现了问题。来自我的应用程序的 Web 请求使用 UTF-16 编码发送,而 Postman 默认使用 UTF-8 编码。我将我的应用程序更改为使用 UTF-8 并且它有效。