Jira平台数据自动化获取(一)--Jira接口请求

来源:互联网 发布:日剧 喜剧 知乎 编辑:程序博客网 时间:2024/04/29 12:14

月末总结中每月需要从Jira平台中统计各个项目的新增、关闭以及遗留bug数,人工去对各个项目进行条件筛选统计,耗时较长且容易出错,故计划做一个自动去筛选获取Jira平台各个项目每个月的数据

Jira请求

首先找到了Jira的API文档:https://docs.atlassian.com/jira/REST/latest/#api/2/search-search,其中的 api/2/search 接口为资源搜索API,包括POST和GET,使用JQL搜索问题且排序jql参数是一个完整的jql表达式,并包括ORDER BY子句。

试着使用http://jira.cvte.com/rest/api/2/search?jql=project = REM AND resolution = Unresolved ORDER BY priority DESC, updated DESC 
在网页端获取到返回的值,结果如下:

{"expand":"schema,names","startAt":0,"maxResults":50,"total":159,"issues":[{"expand":"operations,editmeta,changelog,transitions,renderedFields","id":"27451","self":"http://.../rest/api/2/issue/27451","key":"REM-191","fields":{"fixVersions":[],"resolution":null,"customfield_10510":null,"customfield_10500":null,"customfield_10501":null,"customfield_10502":null,"customfield_10503":null,"customfield_10504":null,"customfield_10505":null,"customfield_10506":null,"customfield_10507":null,"customfield_10508":null,"customfield_10509":null,"lastViewed":"2016-03-12T08:50:42.732+0800","customfield_10460":null,"customfield_10461":null,"priority":                   ......
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在返回值中,只需要”total”:159 这个值,用JAVA去解析获取到的json格式的值:

import net.sf.json.JSONObject;public class JsonDemo {        public static void main(String[] args) {        String str = "{\"expand\":\"schema,names\",\"startAt\":0,\"maxResults\":50,\"total\":159}";        JSONObject jsonObject = JSONObject.fromObject(str);          int total = jsonObject.getInt("total");        System.out.println("Get the total value :"+total);          }   }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行后得到的结果为: 
Get the total value :137

但是上面的请求是由于该网页已经记录我的Jira账号的登录信息,若没的话,返回的值为:

{"errorMessages":["'project' 字段中没有  'REM'","字段 'resolution' 不存在或这个字段不允许匿名用户查看。","无法对字段 'priority'进行排序"],"errors":{}}
  • 1
  • 2
  • 3

故我们现在须先模拟登录Jira平台,先使用Fiddler清空浏览器缓存然后抓包看看登录请求 
这里写图片描述
请求中Cookie包含的变量值:atlassian.xsrf.token、JSESSIONID、ca_uuid、pgv_pvi、pgv_si 
尝试着使用Jmeter等工具模拟发包,返回值中无法获取Cookie中pgv_pvi、pgv_si这两个值。

现使用nodejs模拟Jira登录: 
在使用前,先下载需要使用的module,如下面需要使用的’node-rest-client’和’mysql’模块,可以在http://npm.taobao.org/ 淘宝 NPM 镜像中下载,也可以直接cmd输入npm install node-rest-client 下载node-rest-client等模块

var Client = require('node-rest-client').Client;client = new Client();//提供用户凭据,将用于登录到JIRAvar loginArgs = {    data: {        "username": "******",        "password": "******"      },    headers: {        "Content-Type": "application/json"    }}; client.post("http://.../rest/auth/1/session", loginArgs, function (data, response) {        if (response.statusCode == 200) {            console.log('succesfully logged in, session:', data.session);            var session = data.session;            //获得会话信息,并将其存储在cookie的一个header            var searchArgs = {                headers: {                    //设置会话信息的Cookie                    cookie: session.name + '=' + session.value,                    "Content-Type": "application/json"                },                data: {                 xxxxxx                 }            };
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

将Cookie的值传给search请求,在data中提供添加JIRA搜索附加数据,加入JQL JIRA查询语句,可以进行JQL搜索。 
在Data中添加:

jql: "project = REM AND resolution = Unresolved ORDER BY priority DESC, updated DESC"
  • 1

传递头信息(包括cookie)和附加的查询JQL模块,请求返回搜索结果:

client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {                console.log('status code:', response.statusCode);                console.log('searchResult:', searchResult);});
  • 1
  • 2
  • 3
  • 4

在查询的结果searchResult中,只需要获取total(即bug数)的值,故提取total的值:

var bugsnum = searchResult.total;
  • 1

现需要封装查询函数,将bugsnum的值return给JiraRequest函数:

function JiraRequest(){   client.post("http://.../rest/auth/1/session",loginArgs, function (data, response) {        var bugsnum = searchResult.total;        return bugsnum   }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

此时调用JiraRequest:

var requestResult = JiraRequest();
  • 1

得到requestResult的值为undefined 
这里需要用到一个回调函数:

function JiraRequest(callback) {        // 请求返回搜索结果,通过头信息,包括cookie    client.post("http://.../rest/api/2/search", searchArgs, function (searchResult, response) {       var num = searchResult.total;       callback(num);     });}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

此时调用JiraRequest函数

var callbackFn = function (num) {       console.log('num:'+num);}JiraRequest(callbackFn);
  • 1
  • 2
  • 3
  • 4

也可以这样调用

JiraRequest(function (num) {    console.log(num);});
原创粉丝点击