Azure DevOps REST API - 创建工作项 - "需要提供一个值"

9
我试图使用Azure DevOps REST API创建一个工作项。我已经能够做其他事情,比如运行WIQL查询,但是当我尝试创建一个工作项时,我会得到这个神秘的三重错误:

请求中需要一个值,但未提供
请求中需要一个值,但未提供
请求中需要一个值,但未提供

以下是完整的响应。

{
    "count": 1,
    "value": {
        "Message": "A value is required but was not present in the request.\r\nA value is required but was not present in the request.\r\nA value is required but was not present in the request.\r\n"
    }
}

以下是我尝试做的事情,尽可能地遵循文档

注意:正如被接受的答案所指出的那样,问题是一个拼写错误,在URL中紧跟着?&。由于这些示例在其他方面均有效,为了使任何想要复制和粘贴的人受益,我已经纠正了这个错误。

NodeJS中的最小测试用例

const fetch = require('node-fetch');

const username = '[username]';
const password = '[personal access token]'
const organization = '[organization]';
const project = '[project]'

const authorizationHeader = `Basic ${Buffer.from(
    `${username}:${password}`
  ).toString('base64')}`

const body = [
    { 
        "op":"add",
        "path":"/fields/System.Title",
        "value":"TestCreateWI"
    }
];


  fetch(`https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?api-version=6.0`, {
    method: 'POST',
    headers: {
      Authorization: authorizationHeader,
      'Content-Type': 'application/json-patch+json',
    },
    body: JSON.stringify(body),
  }).then(async (response) => {    
    console.log(await response.text())
  });

使用CURL进行相同的请求

curl 'https://dev.azure.com/MyOrganization/MyProject/_apis/wit/workitems/$Task?api-version=6.0' \
  -H 'Authorization: Basic [redacted]' \
  -H 'Content-Type: application/json-patch+json' \
  --data-binary '[{"op":"add","path":"/fields/System.Title","value":"Test"}]'

在浏览器中发起相同的请求

登录DevOps,确保您的浏览器指向 https://dev.azure.com/YourProject/YourOrganization。然后打开Dev工具(F5),并将此代码粘贴到JS控制台中。


const body = [
    { 
        "op":"add",
        "path":"/fields/System.Title",
        "value":"TestCreateWI"
    }
];

fetch(`${document.URL}/_apis/wit/workitems/$Task?api-version=6.0`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json-patch+json',
  },
  body: JSON.stringify(body),
}).then(async (response) => {    
  console.log(await response.text())
});

我知道它正在读取我的请求,因为如果我将“op”更改为无效值,我会收到不同的错误。我错过了什么吗?


1
我从PowerShell测试中得到了类似的结果。你所做的看起来是正确的,并且与他们文档中的示例相符。你可以在开发者社区上提出问题:https://developercommunity.visualstudio.com/spaces/21/index.html - Matt
@LeoLiu-MSFT,我也在VS开发者社区网站上发布了。有人报告了相同的结果,并且他们也在使用PowerShell脚本。您可以尝试他们的脚本,看看是否会出现错误?这将告诉我们问题是在他们的代码(和我的)中还是服务器上存在问题,影响某些帐户而不影响其他帐户。(我会尝试你们两个的脚本,但我用的是Mac。)谢谢!https://developercommunity.visualstudio.com/content/problem/1249605/azure-devops-rest-api-create-work-item-a-value-is.html - Patrick McElhaney
4个回答

10
你的URL上有个错字。我在Postman中复制了这种行为,并通过修复URL来解决它。大多数其他答案在PowerShell中调用时都没有复制你的错字。
你指定了https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?&api-version=6.0 它在api-version前面不应该有额外的&,正确的URL是https://dev.azure.com/${organization}/${project}/_apis/wit/workitems/$Task?api-version=6.0

1

我在我的任务中没有使用curl,但是以下内容在我的组织中有效:

curl -u "":personal_access_token -d "[{\"op\":\"add\",\"path\":\"/fields/System.Title\",\"value\":\"Sample task\"}]" -H "Content-Type: application/json-patch+json" -X POST https://dev.azure.com/<org>/<project>/_apis/wit/workitems/${Task}?api-version=6.0 

我已经测试了Windows 7.73.0版的curl。

创建个人访问令牌的文档:使用个人访问令牌。此外,在URL中使用工作项类型,例如${工作项类型名称}

如果我使用-d '[{"op":"add","path":"/fields/System.Title","value":"Sample task"}]'发布数据,则服务返回以下答案:

{"$id":"1","innerException":null,"message":"You must pass a valid patch document in the body of the request.","typeName":"Microsoft.VisualStudio.Services.Common.VssPropertyValidationException, Microsoft.VisualStudio.Services.Common","typeKey":"VssPropertyValidationException","errorCode":0,"eventId":3000}


谢谢你的回答。关于“有效补丁文档”的错误是因为您没有转义引号,所以JSON对象无效。由于我正在使用--data-binary,因此我不必转义引号。我可以通过在JSON前面放置“x”来重现您遇到的错误,从而使其无效。无论如何,它对您有效并且您并没有做任何不同的事情表明问题特定于我的组织。这至少有点有帮助。+1 - Patrick McElhaney

-1
Azure DevOps REST API - 创建工作项 - “需要一个值”
我可以使用REST API 工作项 - 创建 和管道中的Powershell任务来创建工作项:
POST https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/${type}?api-version=6.0

请求体为:

  [
    {
      "op": "add",
      "path": "/fields/System.Title",
      "value": "TestCreateWI"
    }
 ]

以下是我的PowerShell脚本:
$connectionToken="$(PAT)"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$url= 'https://dev.azure.com/MyCustomOrganization/MyTestProject/_apis/wit/workitems/$task?api-version=6.0'

$body=@"
  [
    {
      "op": "add",
      "path": "/fields/System.Title",
      "value": "TestCreateWI"
    }
 ]
"@

Write-Host "$url"
$response= Invoke-RestMethod -Uri $url  -ContentType "application/json-patch+json" -Body $body -headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST

测试结果:

enter image description here

enter image description here


谢谢。除了你使用的PowerShell之外,我看不出任何区别。由于我不在Windows上,因此无法尝试您的脚本。最终我想要在NodeJS脚本中调用它。我在问题中使用了curl,以将其简化为最简单的测试案例。 - Patrick McElhaney
我已经更新了我的问题,并添加了两个示例。其中一个使用NodeJS,另一个可以在浏览器的DevTools中执行。 - Patrick McElhaney

-1

您可以尝试在脚本中将URL两侧的"替换为'

我尝试了您提供的链接中提供的PowerShell脚本,并成功地复现了错误。

enter image description here

在我将$uri两侧的'更改为"后,我成功创建了工作项。

此外,在我的测试中,我在URI中使用了%24而不是$,否则会报错。

https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/%24{type}?api-version=6.0

顺便提一下,我的测试环境是Windows PowerShell。


1
谢谢。我用的是Mac,所以无法测试Powershell,但我尝试将“$”替换为“%24”。我已经更新了我的问题,并使用NodeJS和浏览器提供了示例。您能否尝试使用其中一个示例进行复现? - Patrick McElhaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接