通过 REST API 查询 JIRA 和查询中可能的错误值
Querying JIRA via REST API and possible bad values in query
我有一个用户可以访问的门户网站,它建立在 cherrypy 上,其中有一些可以提交的表单,这些表单将通过 REST api 发送到 JIRA 以进行跟踪。提交后,我会从用户提供的表单信息和 JIRA 问题 ID 中获取信息,并将它们发送到 oracle 数据库。
此外,我随后扩展了门户的功能,以便能够通过列表页面查看用户提交,然后 select 一条记录以查看为该提交存储在数据库中的内容。我有想法然后使用 JIRA 的 REST API 来获取 JIRA 中问题的状态和受让人。将我的代码转换为提交给 API 以使用必要的 JQL 语句查询它非常简单,如下所示。
def jira_status_check(jira_id):
if jira_id != "No JIRA Issue":
try:
search_url = "https://myjirainstance.atlassian.net/rest/api/2/search/?jql=issue=" + jira_id + "&fields=status,assignee,resolution"
print search_url
username = 'some_user'
password = 'some_password'
request = urllib2.Request(search_url)
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
request.add_header("Content-Type", "application/json")
result = urllib2.urlopen(request).read()
json_results = json.loads(result)
print json_results
jira_status = json_results["issues"][0]["fields"]["status"]["name"]
if json_results["issues"][0]["fields"]["resolution"] is None:
tmp = "tmp"
if json_results["issues"][0]["fields"]["resolution"] is not None:
jira_status = jira_status + " - " + json_results["issues"][0]["fields"]["resolution"]["name"]
# assignee_name = "TEST"
# assignee_NT = "TEST"
if json_results["issues"][0]["fields"]["assignee"] is None:
assignee_name = "Unassigned"
assignee_NT = "Unassigned"
if json_results["issues"][0]["fields"]["assignee"] is not None:
assignee_name = json_results["issues"][0]["fields"]["assignee"]["displayName"]
assignee_NT = json_results["issues"][0]["fields"]["assignee"]["name"]
# if json_results["issues"][0]["fields"]["assignee"]["displayName"] is not None:
# assignee_name = json_results["issues"][0]["fields"]["assignee"]["displayName"]
# if json_results["issues"][0]["fields"]["assignee"] is None:
# assignee_NT = "Unassigned"
# if json_results["issues"][0]["fields"]["assignee"]["name"] is not None:
# assignee_NT = json_results["issues"][0]["fields"]["assignee"]["name"]
print jira_status
print assignee_name
print assignee_NT
output = [jira_status, assignee_name, assignee_NT]
except:
jira_status = "No JIRA Issue by that number or JIRA inaccessible"
assignee_name = "No JIRA Issue by that number or JIRA inaccessible"
assignee_NT = "No JIRA Issue by that number or JIRA inaccessible"
output = [jira_status, assignee_name, assignee_NT]
else:
jira_status = "No JIRA Issue"
assignee_name = "No JIRA Issue"
assignee_NT = "No JIRA Issue"
output = [jira_status, assignee_name, assignee_NT]
return output
然而,它仅限于一次搜索一条记录,这在您只查看一条记录时有效,但我希望将其扩展到我的列表页面并一次搜索多个 api 查询而不是大量的单一问题查询。我能够使用 jql 和其他 API 在 link 搜索多个问题编号,就像这样 https://myjirainstance.atlassian.net/rest/api/2/search/?jql=Issue%3DSPL-3284%20OR%20Issue%3DSPL-3285&fields=status,assignee,resolution
但后来我在想,如果以某种方式保存了一个错误的问题 ID 并将其作为大规模查询的一部分进行查询会怎样。以前当它是单个记录查询时,它是用我的 jira_status_check
函数中的 except 语句处理的。当我尝试使用 link 查询其余 api 时,就像上次共享的那样,我反而得到了
{"errorMessages":["An issue with key 'SPL-6666' does not exist for field 'Issue'."],"warningMessages":[]}
我尝试通过问题的高级搜索来构建查询,但是当我执行类似 Issue=SPL-3284 OR Issue=SPL-3285 OR Issue=SPL-6666
的操作时,我得到的响应是 An issue with key 'SPL-6666' does not exist for field 'Issue'.
是否有正确的方法通过 JQL 搜索多个问题编号,并且不返回不匹配问题编号的字段的值?
或者我是否坚持对 api 进行大量单一问题查询以涵盖我的基础?这不太理想,并且可能会导致我将 api 查询限制为查看单个记录而不是列表页面以提高可用性。
将查询 JIRA 的函数移动到 javascript/jquery 可以在页面呈现后填充提交列表会更好吗?
我最终联系了 Atlassian 询问我关于 JQL 的问题,然后得到了以下其余 api 文档,并告知了将 validateQuery 参数添加到我的 JQL 以实现我的搜索。 https://docs.atlassian.com/jira/REST/6.1.7/
当我现在在休息时使用与此类似的查询 api link 和我的附加参数
jql=Issue%3DSPL-3284 OR Issue%3DSPL-3285&fields=status,assignee,resolution&validateQuery=true
我返回一个 JSON,其中包含有效问题的实际内容,然后是一个单独的 warningMessages 对象,其中包含任何不好的问题。下面是一个示例 JSON,但显然 $CONTENT 将是查询的实际结果
{
"expand": "schema,names",
"startAt": 0,
"maxResults": 50,
"total": 2,
"issues": [
{
$CONTENT
},
{
$CONTENT
}
],
"warningMessages": [
"An issue with key 'SPL-6666' does not exist for field 'Issue'."
]
}
希望以后其他人会觉得这有帮助
我有一个用户可以访问的门户网站,它建立在 cherrypy 上,其中有一些可以提交的表单,这些表单将通过 REST api 发送到 JIRA 以进行跟踪。提交后,我会从用户提供的表单信息和 JIRA 问题 ID 中获取信息,并将它们发送到 oracle 数据库。
此外,我随后扩展了门户的功能,以便能够通过列表页面查看用户提交,然后 select 一条记录以查看为该提交存储在数据库中的内容。我有想法然后使用 JIRA 的 REST API 来获取 JIRA 中问题的状态和受让人。将我的代码转换为提交给 API 以使用必要的 JQL 语句查询它非常简单,如下所示。
def jira_status_check(jira_id):
if jira_id != "No JIRA Issue":
try:
search_url = "https://myjirainstance.atlassian.net/rest/api/2/search/?jql=issue=" + jira_id + "&fields=status,assignee,resolution"
print search_url
username = 'some_user'
password = 'some_password'
request = urllib2.Request(search_url)
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % base64string)
request.add_header("Content-Type", "application/json")
result = urllib2.urlopen(request).read()
json_results = json.loads(result)
print json_results
jira_status = json_results["issues"][0]["fields"]["status"]["name"]
if json_results["issues"][0]["fields"]["resolution"] is None:
tmp = "tmp"
if json_results["issues"][0]["fields"]["resolution"] is not None:
jira_status = jira_status + " - " + json_results["issues"][0]["fields"]["resolution"]["name"]
# assignee_name = "TEST"
# assignee_NT = "TEST"
if json_results["issues"][0]["fields"]["assignee"] is None:
assignee_name = "Unassigned"
assignee_NT = "Unassigned"
if json_results["issues"][0]["fields"]["assignee"] is not None:
assignee_name = json_results["issues"][0]["fields"]["assignee"]["displayName"]
assignee_NT = json_results["issues"][0]["fields"]["assignee"]["name"]
# if json_results["issues"][0]["fields"]["assignee"]["displayName"] is not None:
# assignee_name = json_results["issues"][0]["fields"]["assignee"]["displayName"]
# if json_results["issues"][0]["fields"]["assignee"] is None:
# assignee_NT = "Unassigned"
# if json_results["issues"][0]["fields"]["assignee"]["name"] is not None:
# assignee_NT = json_results["issues"][0]["fields"]["assignee"]["name"]
print jira_status
print assignee_name
print assignee_NT
output = [jira_status, assignee_name, assignee_NT]
except:
jira_status = "No JIRA Issue by that number or JIRA inaccessible"
assignee_name = "No JIRA Issue by that number or JIRA inaccessible"
assignee_NT = "No JIRA Issue by that number or JIRA inaccessible"
output = [jira_status, assignee_name, assignee_NT]
else:
jira_status = "No JIRA Issue"
assignee_name = "No JIRA Issue"
assignee_NT = "No JIRA Issue"
output = [jira_status, assignee_name, assignee_NT]
return output
然而,它仅限于一次搜索一条记录,这在您只查看一条记录时有效,但我希望将其扩展到我的列表页面并一次搜索多个 api 查询而不是大量的单一问题查询。我能够使用 jql 和其他 API 在 link 搜索多个问题编号,就像这样 https://myjirainstance.atlassian.net/rest/api/2/search/?jql=Issue%3DSPL-3284%20OR%20Issue%3DSPL-3285&fields=status,assignee,resolution
但后来我在想,如果以某种方式保存了一个错误的问题 ID 并将其作为大规模查询的一部分进行查询会怎样。以前当它是单个记录查询时,它是用我的 jira_status_check
函数中的 except 语句处理的。当我尝试使用 link 查询其余 api 时,就像上次共享的那样,我反而得到了
{"errorMessages":["An issue with key 'SPL-6666' does not exist for field 'Issue'."],"warningMessages":[]}
我尝试通过问题的高级搜索来构建查询,但是当我执行类似 Issue=SPL-3284 OR Issue=SPL-3285 OR Issue=SPL-6666
的操作时,我得到的响应是 An issue with key 'SPL-6666' does not exist for field 'Issue'.
是否有正确的方法通过 JQL 搜索多个问题编号,并且不返回不匹配问题编号的字段的值?
或者我是否坚持对 api 进行大量单一问题查询以涵盖我的基础?这不太理想,并且可能会导致我将 api 查询限制为查看单个记录而不是列表页面以提高可用性。
将查询 JIRA 的函数移动到 javascript/jquery 可以在页面呈现后填充提交列表会更好吗?
我最终联系了 Atlassian 询问我关于 JQL 的问题,然后得到了以下其余 api 文档,并告知了将 validateQuery 参数添加到我的 JQL 以实现我的搜索。 https://docs.atlassian.com/jira/REST/6.1.7/
当我现在在休息时使用与此类似的查询 api link 和我的附加参数
jql=Issue%3DSPL-3284 OR Issue%3DSPL-3285&fields=status,assignee,resolution&validateQuery=true
我返回一个 JSON,其中包含有效问题的实际内容,然后是一个单独的 warningMessages 对象,其中包含任何不好的问题。下面是一个示例 JSON,但显然 $CONTENT 将是查询的实际结果
{
"expand": "schema,names",
"startAt": 0,
"maxResults": 50,
"total": 2,
"issues": [
{
$CONTENT
},
{
$CONTENT
}
],
"warningMessages": [
"An issue with key 'SPL-6666' does not exist for field 'Issue'."
]
}
希望以后其他人会觉得这有帮助