如何通过 java 检索 JIRA rest api 的附件列表?
How retrieve a list of attachments JIRA rest api via java?
如何使用 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 link 中没有显示任何附件,但在实际 link 中有 4 个附件。
我知道 Jira api 调用 api/2/issue/{issueIdOrKey}/attachments
。
我试过了:api/2/issue/12925031/attachments
我收到回复 HTTP Status 405 - Method Not Allowed
这是否意味着我无法获取附件列表,或者我只是请求有误?
如何更改我的 java 代码以获取附件?
是否可以从 APACHE JIRA 获取附件?
据我所知,在 Atlassian JIRA 中有一张票可以满足您的体验:REST issue get no longer shows attachments information. Apache's JIRA case is even mentioned in this comment. Quoting another comment:
Attachments are visible in Issue View webpage, but not visible on REST while the field is hidden from the default screen.
问题已经解决,但用户似乎不喜欢它 demand a proper fix:
The "Resolution" above is not a resolution but a workaround for this bug. A proper resolution is for Atlassian to fix this bug so that attachments are always listed in the JSON. There is no way a GUI setting should affect the REST API JSON output - that's clearly wrong! Please reopen and fix this issue.
我同意他们的观点,但这并没有改变这样一个事实,即目前您要完全实现目标的唯一选择是让 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.
希望对你有帮助,保重!
我想说jannis回答让我找到这个问题的答案。
添加参数?expand=changelog
的jannis方法是获取附件的唯一方法。
java 对 getIssue()
的调用需要更改 我找到了如何添加参数 here, the api info is here.
getIssue(String issueKey, ProgressMonitor progressMonitor)
被使用:
Issue issue = jrc.getIssueClient().getIssue(lIssueKey, null);
Issue issue = jrc.getIssueClient().getIssue(lIssueKey, Arrays.asList(IssueRestClient.Expandos.CHANGELOG), null);
随着对 getIssue 的更改调用,应该填充更改日志字段。然后,您可以使用此字段通过遍历更改日志来查看附件。我这样做了:
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..
}
这比你想象的要容易,但出乎意料。仅供参考,以下是 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
}
我添加了参数 fields=*all 来搜索 URL。服务器在每个问题中都包含附件和评论字段。
所以结果 URL 一定是这样的:
http://{host}/rest/api/2/search?jql={jqlQuery}&fields=*all
吉拉版本:6.3.13.
jannis 的解决方法对我不起作用。更改日志中的历史记录中没有附件。
如何使用 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 link 中没有显示任何附件,但在实际 link 中有 4 个附件。
我知道 Jira api 调用 api/2/issue/{issueIdOrKey}/attachments
。
我试过了:api/2/issue/12925031/attachments
我收到回复 HTTP Status 405 - Method Not Allowed
这是否意味着我无法获取附件列表,或者我只是请求有误?
如何更改我的 java 代码以获取附件? 是否可以从 APACHE JIRA 获取附件?
据我所知,在 Atlassian JIRA 中有一张票可以满足您的体验:REST issue get no longer shows attachments information. Apache's JIRA case is even mentioned in this comment. Quoting another comment:
Attachments are visible in Issue View webpage, but not visible on REST while the field is hidden from the default screen.
问题已经解决,但用户似乎不喜欢它 demand a proper fix:
The "Resolution" above is not a resolution but a workaround for this bug. A proper resolution is for Atlassian to fix this bug so that attachments are always listed in the JSON. There is no way a GUI setting should affect the REST API JSON output - that's clearly wrong! Please reopen and fix this issue.
我同意他们的观点,但这并没有改变这样一个事实,即目前您要完全实现目标的唯一选择是让 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.
希望对你有帮助,保重!
我想说jannis回答让我找到这个问题的答案。
添加参数?expand=changelog
的jannis方法是获取附件的唯一方法。
java 对 getIssue()
的调用需要更改 我找到了如何添加参数 here, the api info is here.
getIssue(String issueKey, ProgressMonitor progressMonitor)
被使用:
Issue issue = jrc.getIssueClient().getIssue(lIssueKey, null);
Issue issue = jrc.getIssueClient().getIssue(lIssueKey, Arrays.asList(IssueRestClient.Expandos.CHANGELOG), null);
随着对 getIssue 的更改调用,应该填充更改日志字段。然后,您可以使用此字段通过遍历更改日志来查看附件。我这样做了:
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..
}
这比你想象的要容易,但出乎意料。仅供参考,以下是 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
}
我添加了参数 fields=*all 来搜索 URL。服务器在每个问题中都包含附件和评论字段。
所以结果 URL 一定是这样的:
http://{host}/rest/api/2/search?jql={jqlQuery}&fields=*all
吉拉版本:6.3.13.
jannis 的解决方法对我不起作用。更改日志中的历史记录中没有附件。