【问题标题】:Retrieving labels from multiple JIRA Subtasks via JIRA API通过 JIRA API 从多个 JIRA 子任务中检索标签
【发布时间】:2017-09-20 18:55:25
【问题描述】:

我正在创建一个报告仪表板,目的是为一个项目获取多个工单/问题。大多数人可能都知道,JIRA 问题可以有子任务。这些子任务可以有标签。

我想检索每个子任务的所有标签。

我已经实现了项目 API 请求,它返回父工单 ID 以及所有子任务的问题/工单号。问题是从这个请求返回的数据不包括子任务本身的标签。

我可以遍历每个子任务编号并为每个子任务发出额外的 API 请求以获取标签,但这会导致大量请求。

查看 JIRA 的 API,我找不到更好的方法。 Google 似乎返回了很多关于 Cloud 与 Server 的插件和版本差异的结果,但我还没有找到更好的解决方案。

他们的 API 引用了扩展选项,但我还没有找到一种方法来使该选项适用于子任务标签(我可能遗漏了一些明显的东西)。

如果有人遇到过类似情况,我会很高兴听到您提供的任何建议。谢谢!

我目前拥有的:

项目 API 请求:

https://ourcompanyhere.atlassian.net/rest/api/2/search

为 JQL 字符串添加了一个附加参数:

project=PROJECTNAME AND fixversion=version

这将返回项目中所有带有子任务的工单,但不返回子任务标签。

我可以循环从上述请求返回的数据,并为每个请求发出额外的请求:

https://ourcompanyhere.atlassian.net/rest/api/2/issue/ticketNumberHere

JSON 响应

这是返回的部分 JSON 响应(完整响应很大,我已经删除了关键信息)但是这是票证的完整信息,带有一个带有标签的子任务。如您所见,子任务的标签部分完全丢失了。

ErrorDetail=,
   Mimetype=application/json,
   Statuscode=200 OK,
   Filecontent=   {
      "expand":"schema,names",
      "startAt":0,
      "maxResults":50,
      "total":3,
      "issues":[
         {
            "expand":"operations,versionedRepresentations,editmeta,changelog,renderedFields",
            "id":"24209",
            "self":"https://[instance].atlassian.net/rest/api/latest/issue/24209",
            "key":"DEV-3089",
            "fields":{
               "issuetype":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issuetype/10005",
                  "id":"10005",
                  "description":"A new feature of the product, which has yet to be developed.",
                  "iconUrl":"https://[instance].atlassian.net/secure/viewavatar?size=xsmall&avatarId=10311&avatarType=issuetype",
                  "name":"New Feature",
                  "subtask":false,
                  "avatarId":10311
               },
               "project":{
                  "self":"https://[instance].atlassian.net/rest/api/2/project/10000",
                  "id":"10000",
                  "key":"DEV",
                  "name":"Development Queue",
                  "avatarUrls":{                  
                  }
               },
               "customfield_11000":null,
               "fixVersions":[
                  {
                     "self":"https://[instance].atlassian.net/rest/api/2/version/14600",
                     "id":"14600",
                     "description":"",
                     "name":"",
                     "archived":false,
                     "released":true,
                     "releaseDate":"2017-09-15"
                  }
               ],
               "resolution":{
                  "self":"https://[instance].atlassian.net/rest/api/2/resolution/10000",
                  "id":"10000",
                  "description":"Work has been completed on this issue.",
                  "name":"Done"
               },
               "customfield_10500":"",
               "customfield_10700":null,
               "customfield_10900":null,
               "resolutiondate":"2017-09-15T09:19:37.000-0400",
               "workratio":-1,
               "watches":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issue/DEV-3089/watchers",
                  "watchCount":2,
                  "isWatching":true
               },
               "lastViewed":null,
               "created":"2017-05-02T10:15:08.000-0400",
               "customfield_10022":null,
               "customfield_10100":null,
               "priority":{
                  "self":"https://[instance].atlassian.net/rest/api/2/priority/3",
                  "iconUrl":"https://[instance].atlassian.net/images/icons/priorities/medium.svg",
                  "name":"Medium",
                  "id":"3"
               },
               "customfield_10300":null,
               "labels":[
                  "[label1]",
                  "[label2]",
                  "[label3]",
                  "[label4]",
                  "[label5]",
                  "[label6]"
               ],
               "customfield_10016":null,
               "customfield_10017":null,
               "versions":[

               ],
               "issuelinks":[

               ],
               "assignee":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"[name]",
                  "key":"[name]",
                  "accountId":"[account]",
                  "emailAddress":"[email]",
                  "avatarUrls":{
                  },
                  "displayName":"[name]",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "updated":"2017-09-15T09:19:36.000-0400",
               "status":{
                  "self":"https://[instance].atlassian.net/rest/api/2/status/6",
                  "description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.",
                  "iconUrl":"https://[instance].atlassian.net/images/icons/statuses/closed.png",
                  "name":"Closed",
                  "id":"6",
                  "statusCategory":{
                     "self":"https://[instance].atlassian.net/rest/api/2/statuscategory/3",
                     "id":3,
                     "key":"done",
                     "colorName":"green",
                     "name":"Done"
                  }
               },
               "components":[

               ],
               "description":"[description]",
               "customfield_10010":null,
               "customfield_10011":null,
               "customfield_11100":null,
               "customfield_10012":null,
               "customfield_10013":null,
               "customfield_10015":"",
               "customfield_10005":null,
               "customfield_10006":null,
               "customfield_10600":null,
               "customfield_10007":null,
               "customfield_10008":null,
               "customfield_10800":null,
               "customfield_10009":null,
               "summary":"[summary]",
               "creator":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"",
                  "key":"",
                  "accountId":"",
                  "emailAddress":"",
                  "avatarUrls":{
                  },
                  "displayName":"",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "subtasks":[
                  {
                     "id":"30213",
                     "key":"DEV-4118",
                     "self":"https://[instance].atlassian.net/rest/api/2/issue/30213",
                     "fields":{
                        "summary":"",
                        "status":{
                           "self":"https://[instance].atlassian.net/rest/api/2/status/6",
                           "description":"The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.",
                           "iconUrl":"https://[instance].atlassian.net/images/icons/statuses/closed.png",
                           "name":"Closed",
                           "id":"6",
                           "statusCategory":{
                              "self":"https://[instance].atlassian.net/rest/api/2/statuscategory/3",
                              "id":3,
                              "key":"done",
                              "colorName":"green",
                              "name":"Done"
                           }
                        },
                        "priority":{
                           "self":"https://[instance].atlassian.net/rest/api/2/priority/3",
                           "iconUrl":"https://[instance].atlassian.net/images/icons/priorities/medium.svg",
                           "name":"Medium",
                           "id":"3"
                        },
                        "issuetype":{
                           "self":"https://[instance].atlassian.net/rest/api/2/issuetype/10009",
                           "id":"10009",
                           "description":"",
                           "iconUrl":"https://[instance].atlassian.net/secure/viewavatar?size=xsmall&avatarId=10303&avatarType=issuetype",
                           "name":"Testing Issue",
                           "subtask":true,
                           "avatarId":10303
                        }
                     }
                  }
               "reporter":{
                  "self":"https://[instance].atlassian.net/rest/api/2/user?username=",
                  "name":"",
                  "key":"",
                  "accountId":"",
                  "emailAddress":"",
                  "avatarUrls":{

                  },
                  "displayName":"",
                  "active":true,
                  "timeZone":"America/New_York"
               },
               "customfield_10000":"2017-09-01T12:35:54.706-0400",
               "customfield_10001":null,
               "customfield_10200":null,
               "customfield_10400":null,
               "customfield_10004":null,
               "environment":null,
               "duedate":null,
               "votes":{
                  "self":"https://[instance].atlassian.net/rest/api/2/issue/DEV-3089/votes",
                  "votes":0,
                  "hasVoted":false
               }
            }
         }
      ]
   }

【问题讨论】:

    标签: jira jira-rest-api


    【解决方案1】:

    再次检查/search 端点的响应。在一个完全空的 JIRA Cloud 实例上,我创建了一个项目,一个问题并为其添加了一个子任务。调用/search 端点会返回一个包含两个问题的列表(即问题本身及其子任务),并且对于这两个问题都有一个名为 labels 的字段,其中附加了一个包含所有标签的数组。

    以下是删除了所有不相关数据的简短回复。

    {
      "startAt": 0,
      "maxResults": 50,
      "total": 2,
      "issues": [
        {
          "key": "TEST-1",
          "fields": {
            "labels": []
          }
        },
        {
          "key": "TEST-2",
          "fields": {
            "parent": {
              "key": "TEST-1"
            },
            "labels": [
              "VOILA"
            ]
          }
        }
      ]
    }
    

    编辑

    查看响应后是的,subtasks 中的数组真的很简单,不能单独展开。您需要进行搜索,然后解析出您感兴趣的所有子任务并执行

    • 每个人都有一个单独的/issue/[key] 请求
    • /search 用于这些特定键

    【讨论】:

    • 嗯,我一定会仔细检查。您可以发布您所做的 API 调用以供参考吗?谢谢!
    • 好吧,我现在真的很困惑/很感兴趣,因为我返回的原始 JSON 不包括我的子任务标签。我正在查看带有标签的子任务工单,并且该工单的 JSON 数据中缺少整个标签字段。它没有返回一个空数组,标签字段根本不存在。
    • 您能添加您用于搜索的参数吗?例如,我目前正在使用“.../search?jql=project=[projectName] AND fixVersion =[fixVersion]”,也许我需要做一些不同的事情?我尝试了各种扩展选项,但似乎都没有返回子任务的标签。
    • @isMayoAVariable 编辑您的帖子并添加您收到的完整回复。这听起来很奇怪。
    • 已添加,抱歉花了一点时间。
    【解决方案2】:

    在做了一些进一步的研究后,我找到了一个更好的方法来做到这一点。我仍然没有取回子任务标签,但不是循环遍历每个子任务并为每个子任务发送单独的请求,您可以使用 JQL 执行一个 API 调用,如下所示:

    https://[instance].atlassian.net/rest/api/latest/search?jql=project=[project] AND KEY IN ([comma separated list of tickets])&fields=labels'
    

    &fields=标签

    part 大大减少了返回的信息量。所以现在我总共可以打两个电话,得到我需要的一切。 :)

    想发布这个以防万一有人遇到类似情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 2016-05-09
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多