1. ホーム
  2. Java

JIRA REST API 呼び出し方法

2022-02-17 06:07:28
<パス

キーワード

  • アリババ
  • クラウドエフェクト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