系统要跟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错,原来是环境没部署全。全量发布一版正常了。