【问题标题】:Create workitem in Azure Devops from Postman从 Postman 在 Azure Devops 中创建工作项
【发布时间】:2021-06-14 14:18:01
【问题描述】:

我们希望将所有项目从 Jira 迁移到 Azure Devops,其中之一就是我们的帮助台功能。

我的任务是移植我们当前有关票证的解决方案:我们正在运行一个 Laravel 项目,该项目检查某些电子邮件地址是否有新的帮助请求。当收到新电子邮件时,它会向我们的 Slack 发送通知,其中一名团队成员确认并选择在 Jira 中创建票证的位置。然后它根据 Slack 中的选择在 Jira 中创建一个带有 api 调用的新票证。

我已经找到并试用了 Azure Devops API,可以列出项目和获取工作项等。但我不能通过调用 POST 一个新的工作项

http://dev.azure.com/{organization}/{project}/_apis/wit/workitems/$task?api-version=6.1-preview.3&bypassRules=true

使用这样的 JSON 正文:

[
    {
        "op": "add",
        "path": "/fields/System.Title",
        "from": null,
        "value": "Test of REST functionality"
    },
    {
        "op": "add",
        "path": "/fields/System.State",
        "from": null,
        "value": "New"
    }
]

我收到这样的 JSON 响应

{
    "fields": {
        "System.WorkItemType": "Task",
        "System.AreaPath": "xxxxx",
        "System.TeamProject": "xxxx",
        "System.IterationPath": "xxxx",
        "System.State": "New",
        "System.Reason": "New",
        "Microsoft.VSTS.Common.StateChangeDate": "1753-01-01T00:00:00Z",
        "System.ChangedBy": {
            "displayName": "xxxx",
            "url": "xxxx",
            "_links": {
                "avatar": {
                    "href": "xxxx"
                }
            },
            "id": "xxxx",
            "uniqueName": "xxxx",
            "imageUrl": "xxxx",
            "descriptor": "xxxx"
        },
        "System.CreatedBy": {
            "displayName": "xxxx",
            "url": "xxxx",
            "_links": {
                "avatar": {
                    "href": "xxxx"
                }
            },
            "id": "xxxx",
            "uniqueName": "xxxx",
            "imageUrl": "xxxx",
            "descriptor": "xxxx"
        },
        "Microsoft.VSTS.Common.Priority": 2
    },
    "_links": {
        "workItemType": {
            "href": "https://dev.azure.com/{organization}/{project}/_apis/wit/workItemTypes/Task"
        },
        "fields": {
            "href": "https://dev.azure.com/{organization}/{project}/_apis/wit/fields"
        }
    },
    "url": "https://dev.azure.com/{organization}/{project}/_apis/wit/workItems"
}

最后一个 url 指向一个带有包含此消息的 JSON 对象的页面:

No HTTP resource was found that matches the request URI 'https://dev.azure.com/{project}/_apis/wit/workItems'

并且没有创建新任务。

我从查阅文档开始。

我已尝试使用有关工作项的几种不同权限组合来编辑和重新生成我的个人访问令牌。我已尝试授予 PAT 完全访问权限。

我尝试调用不同版本的 API。

我尝试添加除标题和状态之外的字段,这些字段按要求列出,最后将 bypassRules 设置为 true。

Google 和 /r/azuredevops subreddit 没有返回有效的结果。

谁能指出我应该去哪里,或者我错过了什么? 在此先感谢:-)

编辑:我正在发帖。

编辑解决方案:

我觉得自己好傻。在 Postman 中发布时,我使用 http:// 而不是 https:// 使用 https:// 解决了这个问题。

【问题讨论】:

  • 嗨,根据响应正文,您的邮递员方法似乎是 GET 而不是 POST,您可以查看我的答案,然后在这里分享结果。
  • 嗨,这个问题怎么样?下面的答案是否解决了您的问题?如果没有,请告诉我有关此问题的最新信息吗?
  • 我添加了一些额外的信息 - 主要是这样,但我想知道您的 url 中的内容以及标题中的内容。你有 12 个标题,我有 9 个,而且我的 url 似乎比你的长。
  • 嗨,我已经更新了答案,它包含我的 URL 和带有标题的详细步骤,您可以检查它并在这里分享结果。

标签: azure-devops postman azure-devops-rest-api azure-boards


【解决方案1】:

您正在尝试创建多个任务,根据documentation
,此端点不支持。

我设法用以下主体创建了一个任务:

[
  {
    "op": "add",
    "path": "/fields/System.Title",
    "from": null,
    "value": "Sample task"
  }
]

包含的标题:

  • 内容类型:应用程序/json-patch+json
  • 身份验证:基本编码-PAT

documentation 的正文请求部分中提到了内容类型标头。

对于PAT Token,你只需要vso.work_write,在documentation中也有提到。

端点Url为:https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/$Task?api-version=6.0

响应正文如下所示

{
    "id": 8921,
    "rev": 1,
    "fields": {
        "System.AreaPath": "Project",
        "System.TeamProject": "Project",
        "System.IterationPath": "Project",
        "System.WorkItemType": "Task",
        "System.State": "New",
        "System.Reason": "New",
        "System.CreatedDate": "2021-03-17T10:36:25.513Z",
        "System.CreatedBy": ....,
        "System.ChangedDate": "2021-03-17T10:36:25.513Z",
        "System.ChangedBy": ....,
        "System.CommentCount": 0,
        "System.Title": "Sample task",
        "Microsoft.VSTS.Common.StateChangeDate": "2021-03-17T10:36:25.513Z",
        "Microsoft.VSTS.Common.Priority": 2
    },
    "_links": { some links
    },
    "url": "https://dev.azure.com/Organization/14360bf9-7578-4sfs-b43f-8dfda139fb17/_apis/wit/workItems/8921"
}

最终属性url 包含指向新创建的WorkItem 的正确链接。

【讨论】:

  • 我用一张图片编辑了我的 OP - 我正在发布,但我可以看到你的 url 比我短得多,特别是在 {organization}/{project} 部分周围,而且你有更多头条比我。官方文档说 org 和 project 都应该在 url 中,但是你的截图让我想知道你在 headers 和 url 中是否有其他东西而不是我。 - 官方文档; POST dev.azure.com{organization}/{project}/_apis/wit/workitems/${type}?api-version=6.1-preview.3 - 我有 9 个标题,而你有 12 个?
【解决方案2】:

请检查图片,根据请求正文,您似乎使用的是 REST API get work item type definition 而不是 Create Work Item

如果方法是GET,则获取工作项类型。

请求正文:

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

这样的 JSON 响应:

    {
            "fields": {
                  .....
                },
            "_links": {
                  .....                    
                },
            "url": "https://dev.azure.com/{organization}/{project}/_apis/wit/workItems"
        }

邮递员结果:

如果我们需要创建工作项,我们需要将方法更改为POST

请求网址:

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

请求正文:

[
    {
        "op": "add",
        "path": "/fields/System.Title",
        "from": null,
        "value": "Test of REST functionality"
    },
    {
        "op": "add",
        "path": "/fields/System.State",
        "from": null,
        "value": "New"
    }
]

这样的 JSON 响应:

{
    "id": {Work Item ID},
    "rev": 1,
    "fields": {
      ...
    },
    "_links": {
      ...
    },
    "url": "https://dev.azure.com/{organization}/{project}/_apis/wit/workItems/{Work Item ID}"
}

邮递员结果:

Azure DevOps 服务结果:

更新1

但我想知道你的网址中有什么

我的网址是

https://dev.azure.com/{Org name}/{Project name}/_apis/wit/workitems/$task?api-version=6.0

你有 12 个标题,我有 9 个,而且我的 url 似乎比你的长

  1. 在postman中新建一个请求页面,默认Header为7,输入Request URL,会添加headerCookie,现在Header为8。

  1. 将方法从GET更改为POST,它将添加标题Content-Length,现在标题为9。

  1. 点击Body选项卡->选择raw并将内容类型更改为JSON以添加Request Body,它将添加header @ 987654351@ 现在标题是 10

  1. 点击Authorization选项卡->选择Basic Auth并输入PAT Token作为密码,它将添加标题Authorization,现在标题为11。

  1. 现在,当我们点击发送按钮时,我们将收到错误消息The request indicated a Content-Type of \"application/json\" for method type \"POST\" which is not supported. Valid content types for this method are: application/json-patch+json.

  1. 点击Header选项卡,Content-Type的默认值为application/json,我们需要禁用它并添加新的headerContent-Type并将值设置为application/json-patch+json,现在Header是12

  1. 点击发送按钮,响应码为200

【讨论】:

  • 感谢您的帮助,但我按照您的 T 指南进行操作,得到了完全相同的结果。我已将您的答案标记为正确,因为它是一个很好的指南
  • 我解决了。或者,我的一位同事告诉我,POST 请求在从 http 重定向到 https 时会丢失其正文。所以当我使用 https 时,一切正常。
猜你喜欢
  • 2020-06-11
  • 2019-12-27
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多