JIRA REST API 呼び出し方法
キーワード
- アリババ
- クラウドエフェクトRDC
- Aone
- JIRA
- ゴーデマップ
- フォルクスワーゲン・ドイツ
1. JIRAの紹介
JIRAプラットフォームは国際的に人気のあるプロジェクトの欠陥追跡・管理プラットフォームで、Aliyun RDC(クラウド効果)システムと似ており、どちらも欠陥追跡プラットフォームである。
現在、アリババの内部クラウド効果のようにAoneシステムも実際にJIRAと関連ドッキングを行い、例えば、Gaode Map - ドイツのフォルクスワーゲンプロジェクトは、Aone-Jiraドッキング、二つのプラットフォームのコア操作の一部を同期しています。そのため、JIRAのAPIについて知っておくと、この分野のニーズに遭遇したときに対応できて便利です。
2. JIRA REST API 呼び出し方法
2.1, 許可の検証
パーミッション認証は、主にシンプルで運用が簡単な内部システムとして考えられているBasic認証を使用します。具体的な操作としては、リクエストの http ヘッダに Authorization パラメータを追加し、Basic base64(username:password) という値を取り、ここで username と password は企業自身が導入している JIRA プラットフォームのログインとパスワードとする、以下のようなものである。
パーミッションの検証は、上記の方法で行うことができます。上図のプロジェクト詳細インターフェイスのクエリのhttpリクエストの例として、次の図のような結果が得られます。
*許可証検証記述文書: https://developer.atlassian.com/cloud/jira/platform/jira-rest-api-basic-authentication/
2.2. データのリクエスト
2.2.1、データインターフェイスのドキュメント
*データインタフェース記述文書:https://developer.atlassian.com/cloud/jira/platform/rest/v2/ 現在公開されているインタフェースの正式バージョンはv2です。 インタフェース文書にあるv3はパブリックベータ版ですので、使用しないでください。
インターフェース検索の詳細な使用方法に関するドキュメントです。 https://developer.atlassian.com/cloud/jira/platform/rest/v2/api-group-issue-search/?share_token=748f4cd3-3626-4bcd-8196- 9e545fa2abf7#api-rest-api-2-search-get&tt_from=copy_link&utm_source=copy_link&utm_medium=toutiao_android&utm_center=client_share
jql が jira カスタムクエリ言語である場合、jira はプロジェクト project ID、assignee ticket assignor、orderby sort などのクエリ方法をきちんと定義しています。詳細はドキュメントを参照してください。
2.2.2, 課題リストクエリ
リクエストURL: https://XXX/rest/api/2/search?jql=project=10223+and+assignee=abc+order+by+updated&startAt=0&maxResults=10
リクエスト方法 GET
質問の詳細の結果を返します。
{
"expand":"names,schema",
"startAt":0,
"maxResults":1,
"total":33,
"issues":
[
{detailed question structure reference},
{detailed problem structure reference}
]
}
2.2.3. 課題詳細クエリ
リクエストURL: https://XXX/rest/api/2/issue/{issueIdOrKey}。
リクエスト方法 GET
質問の詳細の結果を返します。
{
"id": "10002",
"self": "http://your-domain.atlassian.net/rest/api/2/issue/10002",
"key": "EX-1",
"fields": {
"watcher": {
"self": "http://your-domain.atlassian.net/rest/api/2/issue/EX-1/watchers",
"isWatching": false,
"watchCount": 1,
"watchers": [
{
"self": "http://your-domain.atlassian.net/rest/api/2/user?accoundId=99:27935d01-92a7-4687-8272-a9b8d3b2ae2e",
"name": "mia",
"displayName": "Mia Krystof",
"active": false
}
]
},
"attachment": [
{
"id": 10001,
"self": "https://your-domain.atlassian.net/rest/api/2/attachments/10001",
"filename": "debuglog.txt",
"author": {
"self": "http://your-domain.atlassian.net/rest/api/2/user?username=mia",
"key": "mia",
"accountId": "99:27935d01-92a7-4687-8272-a9b8d3b2ae2e",
"name": "mia",
"avatarUrls": {
"48x48": "http://your-domain.atlassian.net/secure/useravatar?size=large&ownerId=mia",
"24x24": "http://your-domain.atlassian.net/secure/useravatar?size=small&ownerId=mia",
"16x16": "http://your-domain.atlassian.net/secure/useravatar?size=xsmall&ownerId=mia",
"32x32": "http://your-domain.atlassian.net/secure/useravatar?size=medium&ownerId=mia"
},
"displayName": "Mia Krystof",
"active": false
},
"created": "2018-10-10T23:10:51.169+0000",
"size": 2460,
"mimeType": "text/plain",
"content": "https://your-domain.atlassian.net/jira/attachments/10001",
"thumbnail": "https://your-domain.atlassian.net/jira/secure/thumbnail/10002"
}
],
"sub-tasks": [
{
"id": "10000",
"type": {
"id": "10000",
"name": "",
"inward": "Parent",
"outward": "Sub-task"
},
"outwardIssue": {
"id": "10003",
"key": "EX-2",
"self": "http://your-domain.atlassian.net/rest/api/2/issue/EX-2",
"fields": {
"status": {
"iconUrl": "http://your-domain.atlassian.net/images/icons/statuses/open.png",
"name": "Open"
}
}
}
}
],
"description": "example bug report",
"project": {
"self": "http://your-domain.atlassian.net/rest/api/2/project/EX",
"id": "10000",
"key": "EX",
"name": "Example",
"avatarUrls": {
"48x48": "http://your-domain.atlassian.net/secure/projectavatar?size=large&pid=10000",
"24x24": "http://your-domain.atlassian.net/secure/projectavatar?size=small&pid=10000",
"16x16": "http://your-domain.atlassian.net/secure/projectavatar?size=xsmall&pid=10000",
"32x32": "http://your-domain.atlassian.net/secure/projectavatar?size=medium&pid=10000"
},
"projectCategory": {
"self": "http://your-domain.atlassian.net/rest/api/2/projectCategory/10000",
"id": "10000",
"name": "FIRST",
"description": "First Project Category"
},
"simplified": false,
"style": "classic"
},
"comment": [
{
"self": "http://your-domain.atlassian.net/rest/api/2/issue/10010/comment/10000",
"id": "10000",
"author": {
"self": "http://your-domain.atlassian.net/rest/api/2/user?accoundId=99:27935d01-92a7-4687-8272-a9b8d3b2ae2e",
"name": "mia",
2.2.4. プロジェクト課題の更新
リクエストURL: https://XXX/rest/api/2/issue/{issueIdOrKey}
リクエスト方法 PUT
テストする(JIRAにテストチケットを作成する必要がある)
2.2.5. プロジェクト課題コメント作成
リクエストURL: https://XXX/rest/api/2/issue/{issueIdOrKey}/comment
リクエスト方法 POST
テストする(JIRAにテストチケットを作成する必要がある)。
2.2.6. プロジェクト課題の添付ファイル追加
リクエストURL: https://XXX/rest/api/2/issue/{issueIdOrKey}/attachments
リクエスト方法 POST
テストする(JIRAにテストチケットを作成する必要がある)。
3. JAVAテスト
httpリクエストメソッド
@Override
public JiraHttpResponse doGetMethod(String url) {
JiraHttpResponse jiraHttpResponse = new JiraHttpResponse();
boolean success = false;
String exception = "";
String body = "";
logger.info("request url:" + url);
logger.info("request method: get");
if (!Constant.emptyString.equals(url)) {
CloseableHttpClient closeableHttpClient = createCloseableHttpClient();
RequestConfig defaultConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build();
HttpGet httpGet;
HttpResponse httpResponse;
httpGet = new HttpGet(url);
// Set CookieSpecs policy
httpGet.setConfig(defaultConfig);
// Define request header and authentication parameters
httpGet.setHeader("Accept","application/json");
httpGet.setHeader("Content-Type","application/json");
httpGet.setHeader("Authorization","Basic " + bash64Util.getBase64(configBean.getJiraAccount() + ":" + configBean.getJiraPassword()));
try {
httpResponse = closeableHttpClient.execute(httpGet);
logger.info("httpStatus=" + httpResponse.getStatusLine().getStatusCode());
if (HttpStatus.SC_OK == httpResponse.getStatusLine().getStatusCode()) {
HttpEntity httpEntity = httpResponse.getEntity();
if (httpEntity ! = null) {
body = EntityUtils.toString(httpEntity,"UTF-8");
logger.info("body length:" + body.length());
success = true;
} else {
exception = "JIRA request return entity is empty! ";
}
}
} catch (IOException e) {
e.printStackTrace();
exception = "JIRA data request failed! ";
} finally {
closeHttpClient(closeableHttpClient);
}
} else {
exception = "JIRA request address is empty! ";
}
jiraHttpResponse.setSuccess(success);
jiraHttpResponse.setErrorMessage(exception);
jiraHttpResponse.setBody(body);
logger.info(jiraHttpResponse.toString());
return jiraHttpResponse;
}
リクエストの結果です。
2018-10-12 15:03:46.671 INFO 107496 --- [959D39DD333BC-0] c.a.c.j.s.impl.HttpClientServiceImpl : request url:https://XXX/rest/api/2/search? jql=project=10223+and+assignee=abc+order+by+updated&startAt=0&maxResults=10
2018-10-12 15:03:46.672 INFO 107496 --- [959D39DD333BC-0] c.a.c.j.s.impl.HttpClientServiceImpl : request method: get
2018-10-12 15:03:47.298 INFO 107496 --- [959D39DD333BC-0] com.amap.chexian.jira.util.Bash64Util : Bash64Utils.getBash64FromUrl bash64 size: 28
2018-10-12 15:03:52.416 INFO 107496 --- [959D39DD333BC-0] c.a.c.j.s.impl.HttpClientServiceImpl : httpStatus=200
2018-10-12 15:03:52.681 INFO 107496 --- [959D39DD333BC-0] c.a.c.j.s.impl.HttpClientServiceImpl : body length:235270
2018-10-12 15:03:52.683 INFO 107496 --- [959D39DD333BC-0] c.a.c.j.s.impl.HttpClientServiceImpl : JiraHttpResponse{success=true, errorMessage='', body='{"expand":"schema,names","startAt":0,"maxResults":10,"total& quot;:34,"issues":[]}'}
4. 参考文献
1. JIRA REST API テストサンプル https://developer.atlassian.com/server/jira/platform/jira-rest-api-examples/
2. JIRA API 説明文書 https://developer.atlassian.com/cloud/jira/platform/rest/v2/
3、JIRA JQL 構文説明 https://www.atlassian.com/blog/jira-software/jql-the-most-flexible-way-to-search-jira-14
4. JIRA導入の基礎知識 https://blog.csdn.net/liumiaocn/article/details/81301550
関連
-
エラー: jdkのバージョンの問題により、クエリへの参照が曖昧になる
-
Springの構成でエラーなくIntelliJのアイデア、アセンブリオブジェクトは、自動配線できませんでした。
-
JAVAMail TLS配信の注意点
-
Java 文字クラスとメソッド
-
java.lang.UnsupportedOperationException 解決方法
-
リクエストのエンティティが大きすぎる問題の解決
-
java にリソースリークがある: 'input' が閉じられない Solution
-
エラー コンストラクタ worker(int, String, float) は未定義です。
-
Javaで未処理の例外が発生する理由
-
トークンに関する構文エラー、代わりに AnnotationName が期待される 構文エラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限です。タイプ 'BASE64Decoder' は API ではない (必要なライブラリ xxx の制限)
-
Map<String,Boolean> 型をインスタンス化できません。
-
SLF4J: クラスパスが複数の SLF4J バインディングを含んでいる Error
-
Java の例外解決。コンストラクタの呼び出しはコンストラクタ内の最初のステートメントでなければならない
-
mvn -v error: main class not found or couldn't be loaded org.codehaus.plexus.classworlds.launcher.
-
Error: missing `server' JVM at `C:\Program Files (x86)\Javajre1.8.0_151bin server╱jvm.dll'.
-
環境変数JAVA_HOME(値xxx)が有効なJVMのインストール先を指していません。
-
未処理の例外:java.text.ParseException
-
中に内部エラーが発生しました。「pro-test 用のディスクリプタをロードしています。
-
org.apache.tools.zip を使用した Zip 圧縮・解凍