如何通过java检索附件列表JIRA rest api?

时间:2016-01-11 21:05:42

标签: java apache jira jira-rest-api jira-rest-java-api

如何使用JIRA API和Java获取附件列表?我不需要附件我只想知道附件是什么,以及他们的ID。 我遵循了使用查询来解决问题的基础知识,但我遇到了问题,但没有问题。 我的代码:

[String searchQuery = "(created >= '2015/12/1' ) AND (created < '2016/01/1')" 
JiraAuthentication jiraAuth;
JiraRestClient arc;
// Get JiraAuthentication instance to create basic HTTP authentication
// string
jiraAuth = JiraAuthentication.getInstance();

// Make sure you use a new instance
jiraAuth.initInstance();
jiraAuth = JiraAuthentication.getInstance();

// Get the JIRA Rest Client from the basic HTTP authentication
jrc = jiraAuth.getJrc();

// Receive search results based on query
SearchRestClient searchClient = jrc.getSearchClient();
// limit results to 50
SearchResult result = searchClient.searchJql(searchQuery, 50,0, null);
Iterator<BasicIssue> itIssue = result.getIssues().iterator();

// pull information on individual issues.
while (itIssue.hasNext()) {
   BasicIssue lBasicIssue = (BasicIssue) itIssue.next();
   String lIssueKey = lBasicIssue.getKey();
   Issue issue = jrc.getIssueClient().getIssue(lIssueKey, null);
   //This line should print the list of attachments. but everything is always null.
   System.out.println(issue.getAttachements());
}][1]

我试图获取信息的一个示例来自HBASE-15062,其中包含api link。在api链接中没有显示任何附件,但在实际链接中有4个附件。

我知道Jira api电话api/2/issue/{issueIdOrKey}/attachments

我试过了:api/2/issue/12925031/attachments 我得到了回复HTTP Status 405 - Method Not Allowed这是否意味着我无法获得附件列表或者我只是在做错了请求?

如何更改我的java代码以获取附件? 是否可以从APACHE JIRA获得附件?

4 个答案:

答案 0 :(得分:3)

从我所看到的情况来看,Atlassian JIRA有一张机票可以让您体验到:REST issue get no longer shows attachments information。在this comment中甚至提到了Apache的JIRA案例。引用another comment

  

附件在问题视图网页中可见,但在默认屏幕中隐藏字段时,在REST上不可见。

错误已经解决,但用户似乎并不喜欢它demand a proper fix

  

上面的“解决方案”不是解决方案,而是此错误的解决方法。适当的解决方案是让Atlassian修复此错误,以便始终在JSON中列出附件。 GUI设置无法影响REST API JSON输出 - 这显然是错误的!请重新打开并解决此问题。

我同意他们的意见,但这并没有改变这样一个事实,即目前你干净利落地实现目标的唯一选择就是让Apache采取行动。无论如何,我似乎有一个解决方法。

解决方法

我不知道您正在使用的客户端工具,因此我将使用纯REST方法描述解决方法。将附件添加到问题时,会在故障单的更改日志中记录该事件:

https://issues.apache.org/jira/rest/api/2/issue/HBASE-15062?expand=changelog

{
   (...),          
   "changelog": {
      "startAt":0,
      "maxResults":8,
      "total":8,
      "histories":[
         (...),
         {                 
            "id":"15174314",
            "author":{...},
            "created":"2015-12-31T15:55:43.318+0000",
            "items":[  
               {  
                  "field":"Attachment",
                  "fieldtype":"jira",
                  "from":null,
                  "fromString":null,
                  "to":"12780132",
                  "toString":"HBASE-15062-v0.patch"
               }
            ]
         },
         {  
            "id":"15174320",
            "author":{...},
            "created":"2015-12-31T16:06:03.165+0000",
            "items":[  
               {  
                  "field":"Attachment",
                  "fieldtype":"jira",
                  "from":null,
                  "fromString":null,
                  "to":"12780133",
                  "toString":"HBASE-15062-v1.patch"
               }
            ]
         },             
         {  
            "id":"15184002",
            "author":{...},
            "created":"2016-01-04T08:04:50.969+0000",
            "items":[  
               {  
                  "field":"Attachment",
                  "fieldtype":"jira",
                  "from":null,
                  "fromString":null,
                  "to":"12780273",
                  "toString":"HBASE-15062-v1.patch"
               }
            ]
         },
         {  
            "id":"15187193",
            "author":{...},
            "created":"2016-01-05T21:30:48.977+0000",
            "items":[  
               {  
                  "field":"Attachment",
                  "fieldtype":"jira",
                  "from":null,
                  "fromString":null,
                  "to":"12780629",
                  "toString":"HBASE-15062-v1.patch"
               }
            ]
         },
         (...)
      ]
   }
}

让我们考虑一下id为12780132的日志中的第一个附件。了解id后,您可以在API中查询附件的详细信息:

https://issues.apache.org/jira/rest/api/2/attachment/12780132

{  
   "self":"https://issues.apache.org/jira/rest/api/2/attachment/12780132",
   "filename":"HBASE-15062-v0.patch",
   "author":{  
      "self":"https://issues.apache.org/jira/rest/api/2/user?username=asamir",
      "key":"asamir",
      "name":"asamir",
      "avatarUrls":{  
         "48x48":"https://issues.apache.org/jira/secure/useravatar?avatarId=10452",
         "24x24":"https://issues.apache.org/jira/secure/useravatar?size=small&avatarId=10452",
         "16x16":"https://issues.apache.org/jira/secure/useravatar?size=xsmall&avatarId=10452",
         "32x32":"https://issues.apache.org/jira/secure/useravatar?size=medium&avatarId=10452"
      },
      "displayName":"Samir Ahmic",
      "active":true
   },
   "created":"2015-12-31T15:55:43.304+0000",
   "size":2173,
   "mimeType":"text/x-patch",
   "properties":{  

   },
   "content":"https://issues.apache.org/jira/secure/attachment/12780132/HBASE-15062-v0.patch"
}

现在您已获得下载附件的所有信息:

https://issues.apache.org/jira/secure/attachment/12780132/HBASE-15062-v0.patch

希望它有所帮助,保重!

答案 1 :(得分:2)

我想说jannis回答引导我回答这个问题。

添加参数?expand=changelog

jannis方法是获取附件的唯一方法。 getIssue()的java调用需要更改我发现如何添加参数here,api信息为here

使用了

getIssue(String issueKey, ProgressMonitor progressMonitor)

Issue issue = jrc.getIssueClient().getIssue(lIssueKey, null);
应该使用

Issue getIssue(String issueKey, Iterable<IssueRestClient.Expandos> expand, ProgressMonitor progressMonitor)

   Issue issue = jrc.getIssueClient().getIssue(lIssueKey, Arrays.asList(IssueRestClient.Expandos.CHANGELOG), null);

更改了对getIssue的调用后,应填充changelog字段。然后,您可以通过迭代更改日志来使用此字段查看附件。我这样做了:

private null findAttachments(Issue issue) {
    String FieldName = "Attachment";
    Iterable<ChangelogGroup> changes = issue.getChangelog();
    StringBuilder attachments = new StringBuilder();
    StringBuilder attachmentsIDs = new StringBuilder();

    for (ChangelogGroup change: changes){
        //Multiple change items per group. 
        for(ChangelogItem item: change.getItems()){
            if(item.getField().equals(FieldName)){
                //Gets attachment name.
                attachments.append((String) item.getToString());
                //Gets attachment ID to download if needed.
                attachmentsIDs.append((String) item.getTo());
            }
        }
    }
    //Do something with attachments here..

}

答案 2 :(得分:0)

这比你想象的容易,但却出乎意料。仅供参考,以下是groovy,所以java会略有不同。

确保在默认屏幕上显示附件(Jira-Rest-Java-Client的getIssue必须填充getAttachments()结果。听起来很疯狂,但是当我添加它并修改默认字段配置以显示它时 - 以下都工作了。

    @Test
void addAttachmentTest() {
    String priority = "Blocker"
    String project = "TESTRELENG"
    String summary = "summary addAttachmentTest@${hostName} - ${now.getTime()}"
    String description = "desc addAttachmentTest@${hostName} - ${now.getTime()}"


    // Create Issue
    def issue = controller.addBug(project, priority, summary, description)

    // Create Attachment File
    File attachment = new File("build/testdata/${name.getMethodName()}/attachment.txt")
    attachment.parentFile.mkdirs()
    def expectedText ="${name.getMethodName()} - ${hostName} - ${now.getTime()}"
    attachment.write(expectedText)

    // add attachment
    controller.addAttachment(issue.getKey(), attachment)
    Issue result = controller.getIssue(issue.key)

    // Verify
    File outputFile = new File(attachment.parentFile, "output.txt")
    controller.downloadAttachment(result.key, attachment.name, outputFile)
    assertEquals(attachment.text, outputFile.text)

    // Clean up
    controller.deleteIssue(issue.getKey())
}

<强> JiraController

class JiraController {
   def user
   def url
   def password
   JiraRestClient client
  ....
JiraRestClient getClient() {
    if (null == client) {
        AsynchronousJiraRestClientFactory factory = new AsynchronousJiraRestClientFactory()
        client = factory.create(url.toURI(), new BasicHttpAuthenticationHandler(user,password))

    }
    return client
}
...
Issue getIssue(String issueKey) {
    Issue issue
    try {
        issue = getClient().getIssueClient().getIssue(issueKey).claim()
    } catch (RestClientException e) {
        throw new JiraControllerException("Cannot access ${issueKey} due to permissions.", e)
    }
    return issue
}
...
/**
 * Get Attachment Info object
 * @param issueKey
 * @param attachmentName
 * @return
 */
public Attachment getAttachmentByName(String issueKey, String attachmentName) {
    Issue issue = getIssue(issueKey)
    Attachment found = issue.attachments.find() { Attachment attachment ->
        attachment.filename == attachmentName
    }
    if (!found) {
        def names = issue.attachments.collect() { Attachment a -> a.filename}
        throw new JiraControllerException("Cannot Locate ${issueKey} Attachment ${attachmentName}.  Options: " + names)
    }
    return found
}

答案 3 :(得分:0)

我添加了参数字段= * all来搜索URL。服务器在每个问题中都包含附件和评论字段。

因此结果URL必须是这样的:

  

http:// {host} / rest / api / 2 / search?jql = {jqlQuery}&fields = * all

Jira版本:6.3.13。

jannis的解决方法不适用于我。变更日志中的历史记录没有附件。