Azure DevOps REST API - 创建工作项 - “需要一个值”

Posted

技术标签:

【中文标题】Azure DevOps REST API - 创建工作项 - “需要一个值”【英文标题】:Azure DevOps REST API - Create Work Item - "A value is required" 【发布时间】:2021-02-22 12:29:37 【问题描述】:

我正在尝试使用 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"
    


这就是我正在尝试做的事情,尽我所能遵循documentation。

注意:正如接受的答案所说,问题是一个拼写错误,紧跟在 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 Tools (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”更改为无效值,我会收到不同的错误。我错过了什么?

【问题讨论】:

我得到了类似的结果,从 PowerShell 进行测试。你所拥有的看起来是正确的,并且与他们的文档样本保持一致。您可能只是在开发者社区提出问题:developercommunity.visualstudio.com/spaces/21/index.html @LeoLiu-MSFT 我还在 VS 开发者社区网站上发帖。那里有人报告了相同的结果,他们也在使用 Powershell 脚本。你可以试试他们的脚本,看看你是否得到错误?这将告诉我们问题是否出在他们的代码(和我的)中,或者服务器上是否存在影响某些帐户但不影响其他帐户的问题。 (我自己会尝试你的两个脚本,但我在 Mac 上。)谢谢! developercommunity.visualstudio.com/content/problem/1249605/… 【参考方案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。

创建个人访问令牌的文档:Use personal access tokens。此外,在 url 中使用工作项类型,例如 $work item type name

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

"$id":"1","innerException":null,"message":"你必须传递一个有效的 正文中的补丁文件 请求。","typeName":"Microsoft.VisualStudio.Services.Common.VssPropertyValidationException, Microsoft.VisualStudio.Services.Common","typeKey":"VssPropertyValidationException","errorCode":0,"eventId":3000

【讨论】:

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

Azure DevOps REST API - 创建工作项 - “需要一个值”

我可以使用 REST API Work Items - Create 在我的管道中使用 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

测试结果:

【讨论】:

谢谢。除了您使用的是 powershell 之外,我看不出有任何区别。我不在 Windows 上,所以我无法尝试您的脚本。最终我希望在 NodeJS 脚本中调用。我在问题中使用 curl 将其简化为最简单的测试用例。 我用另外两个例子更新了我的问题。一个使用 NodeJS,另一个可以在浏览器的 DevTools 中执行。【参考方案3】:

您可以尝试用' 替换脚本中网址两侧的"

我尝试了您提供的the link中提供的PowerShell脚本,并成功重现了错误。

我把$uri两边的'改成"后,就可以成功创建工作项了。

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

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

PS。我的测试环境是 Windows PowerShell。

【讨论】:

谢谢。我在 Mac 上,因此无法测试 Powershell,但我确实尝试将 $ 替换为 %24。我已经使用 NodeJS 和浏览器的示例更新了我的问题。您可以尝试使用其中一个示例进行复制吗?【参考方案4】:

您的网址有误。我在邮递员中复制了该行为并通过修复 URL 来解决它。在 PowerShell 中调用“工作”的大多数其他答案都没有复制您的错字。

您指定了https://dev.azure.com/$organization/$project/_apis/wit/workitems/$Task?&amp;api-version=6.0

在 api-version https://dev.azure.com/$organization/$project/_apis/wit/workitems/$Task?api-version=6.0 之前不应该有多余的 &

【讨论】:

以上是关于Azure DevOps REST API - 创建工作项 - “需要一个值”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Azure DevOps REST Api 编写构建计划脚本?

尝试使用 Azure DevOps Rest API 创建发布定义时出错

Azure DevOps REST API - 创建工作项 - “需要一个值”

检查分支被锁定的次数以及锁定 Azure DevOps Rest API 的可能原因

使用 DevOps Release REST API 确定发布完成的时间

无法在 PowerShell 中使用 REST API 删除 DevOps 分支