系統要跟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錯,原來是環境沒部署全。全量發布一版正常了。