(一)JIRA API 对接

系统要跟JIRA对接,将本系统数据发送给jira,jira数据返回给本系统。

 

开始一头雾水怎么让数据传过去已什么形式存在,是存数据库呢还是怎么显示呢。研究半天发现其实只要将原数据作为json数据提供给jira接口,jira接口进行创建issue。

但前提在于要先创建项目。

jira的API 有很多有创建项目的,创建问题等。在线找到了6.1版本的API,根据这个文档可以查看是get还是post,需要哪种类型的json文件,返回值是什么。https://docs.atlassian.com/DAC/rest/jira/6.1.html

 

了解了jira的api开始写本系统的接口,jira使用的是restful的接口,所以很好调用。

第一步使用了soapui将数据格式先调通,而在工具下发现了很多问题,但都有一定的返回值,详细描述了错误。原因1:json文件的错误;原因2:没有给定权限。

怎么解决呢?1.json格式先查看json格式在看内容。2.返回权限问题时,想到添加个header然后加个cookies。

 

所以在调用接口是先调用取cookies的接口,添加到header中,然后创建issue。

string seesionsjson =HttpPost("Post","xxxxx:8080/rest/auth/1/session", postuser, "");

string issueNumber = HttpPost("Post", "xxxxxx/rest/api/2/issue", postBody, seesionsjson);

public string HttpPost(string type, string url, string body, string header)
{
try
{
Encoding encoding = Encoding.UTF8;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = type;
request.Accept = "text/html, application/xhtml+xml, */*";
request.ContentType = "application/json";
if (header != "")
{
JObject obj = (JObject)JsonConvert.DeserializeObject(header);
string ss = obj["session"]["name"].ToString() + "=" + obj["session"]["value"].ToString();
request.Headers.Add("Cookie", ss);

}
byte[] buffer = encoding.GetBytes(body);
request.ContentLength = buffer.Length;

request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
catch (Exception ex)
{
return "";
}
}

在调通接口之后,jira中会创建相关的问题,问题类型为story或者task或者自定义的类型。

再说一下自定义的问题类型如何通过接口来创建该问题类型的问题。

首先要先在jira中创建问题类型,再分配给项目。然后通过  xxx/rest/api/2/issuetype 接口查看自定义问题类型的id,找到id即可。

 从jira拿数据返回给本系统:

使用httpget方法与post类似,若需要登录后取值给定header值。

public string HttpGet(string Url, string header)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
request.Method = "GET";
request.ContentType = "application/json; charset=UTF-8";
if (header != "")
{
JObject obj = (JObject)JsonConvert.DeserializeObject(header);
string ss = obj["session"]["name"].ToString() + "=" + obj["session"]["value"].ToString();
request.Headers.Add("Cookie", ss);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream myResponseStream = response.GetResponseStream();
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
myResponseStream.Close();
return retString;
}

在使用类中

  string IssueJson= a.HttpGet("xxx:8008/jira/getissue?prokey=" + prokey, "");该接口是自己开发,大量数据已整理。(jira自带的接口可用/rest/api/2/search?jql=project=prokey  取相应的值)

通过将json数据反序列化成对象,json中有数组为list,对象与json数据的字段相同。json如{"a":"1","b":"2","c":[{"d":"3"},{"e":"4","f":[{"g":"5"}]}]}

var jo = JsonConvert.DeserializeObject<T>(IssueJson);
List<T> aa= new List<T>();

for (int k = 0; k < jo.Issues.Count; k++)
{ 
for (int i = 0; i < jo.Issues[k].Moduls.Count; i++)
{ 
for (int j = 0; j < jo.Issues[k].Moduls[i].Functions.Count; j++)
{
T ad = new T();
ad.ChildSystem = jo.Issues[k].ChildSystem;
ad.ModulName = jo.Issues[k].Moduls[i].ModulName;
ad.FunctionName = jo.Issues[k].Moduls[i].Functions[j].FunctionName;
ad.ARID = ARID;
ad.IsDelete = 0;
aa.Add(ad);
}
}
}
return aa;

 

public class T
{
public List<T> Issue { get; set; }
public string code { get; set; }
public string message { get; set; }
}

另一种json格式:[{"d":"3"},{"e":"4","f":[{"g":"5"}]}]

var jo = JsonConvert.DeserializeObject<List<T>>(IssueJson);

 

 

ps:jira插件的研究

在jira中创建成功后,jira中的展示。

研究了下jira的插件structure,可以将需求以下拉的形式展示,下载插件版本,然后在jira的插件中add-to插件的jar包,之后添加license,否则无法出现插件。还有一个情况如果版本过高或过低会导致页面刷不出来,再去下载个版本一致的即可,就会出现此页面。

可进行自动也可以手动添加。手动添加使用add-》search&add拖动即可。

自动则点automation,添加规则。添加

 一个小错误:在开发完成后部署到测试环境,发现永远调不通,咋回事,报500错,原来是环境没部署全。全量发布一版正常了。

posted @ 2019-04-04 10:34  lovebear  阅读(11355)  评论(0编辑  收藏  举报