JetBrains Space ヘルプ

Web フック

Webhook を使用すると、アプリケーションは Space のイベントに関する通知を受信できるようになります。イベントがトリガーされると、Space は指定されたアプリケーションエンドポイントに POST リクエストを送信します。リクエストには、イベントの詳細を含む JSON ペイロードが含まれています。Space では、Webhook はアプリケーションの不可欠な部分です。各アプリケーションは、独自の構成済み Webhook セットを持つことができ、アプリケーションとは別に Webhook を作成することはできません。

アプリケーションの Webhook を作成するには 2 つの方法があります。

このセクションには両方の方法の手順が含まれています。

Webhook を作成する

次の例では、特定のプロジェクトでイベントを発行するためのサブスクリプションを持つ Webhook を作成します。

import space.jetbrains.api.ExperimentalSpaceSdkApi import space.jetbrains.api.runtime.helpers.ProcessingScope import space.jetbrains.api.runtime.resources.applications import space.jetbrains.api.runtime.types.* @ExperimentalSpaceSdkApi suspend fun ProcessingScope.setupWebhooks() { val spaceClient = clientWithClientCredentials() // Create a webhook for the app val webhook = spaceClient.applications.webhooks.createWebhook( // The application for which the webhook is created application = ApplicationIdentifier.Me, name = "Issue and project events", description = "Track when an issue is created, or a title or a description is updated", // List of HTTP codes treated as successful responses acceptedHttpResponseCodes = listOf(200), // Create subscriptions for specific events. // We recommend creating one subscription per webhook // or several subscriptions for closely related events. subscriptions = listOf(SubscriptionDefinition( name = "Issues created, deleted, or updated", subscription = CustomGenericSubscriptionIn( // The subject of the subscription. // E.g. "Issue", "Project", "Meeting", etc. subjectCode = "Issue", // Event filters. The filters depend on the subject. // E.g. for "Issue", you can subscribe to events in a specific project. filters = listOf(ProjectCommonSubscriptionFilterIn( project = "2PCwjr4gY8Bs" )), // To apply no filters, use emptyList as shown below // filters = emptyList(), eventTypeCodes = listOf( "Issue.Created", "Issue.Deleted", "Issue.TitleUpdated", "Issue.DescriptionUpdated" ) ) )), // Fields to be included in the webhook payload. // By default, only top-level fields are included. payloadFields = { issue{ id() title() description() projectId() archived() } } ) }

複数組織アプリケーションの場合は、アプリケーションのインストール中、つまり InitPayload の処理中に Webhook を作成することをお勧めします。

Space.processPayload(ktorRequestAdapter, spaceHttpClient, AppInstanceStorage) { payload -> when (payload) { is InitPayload -> { setupWebhooks() // other installation activities // ... } is WebhookRequestPayload -> { // process webhook asynchronously, respond to Space immediately launch { processWebhookEvent(payload) } } } SpaceHttpResponse.RespondWithOk }

次の例では、特定のプロジェクトでイベントを発行するためのサブスクリプションを持つ Webhook を作成します。

POST https://mycompany.jetbrains.space/api/http/applications/me/webhooks Authorization: Bearer here-goes-the-access-token Accept: application/json Content-Type: application/json { "name": "Issue and project events", "description": "Track when an issue is created, or a title or a description is updated", "acceptedHttpResponseCodes": [], "payloadFields": "issue", "subscriptions": [ { "name": "Issues created, deleted, or updated", "subscription": { "subjectCode": "Issue", "filters": [ { "className": "ProjectCommonSubscriptionFilterIn", "project": "2PCwjr4gY8Bs" } ], "eventTypeCodes": [ "Issue.Created", "Issue.Deleted", "Issue.TitleUpdated", "Issue.DescriptionUpdated" ] } } ] }
  1. 拡張 | アプリケーションで、必要なアプリケーションを開きます。

  2. Web フックタブを開き、新しい Webhook をクリックします。

  3. Webhook 名前を指定し、作成をクリックします。

  4. Web フックタブで、必要な Webhook を開きます。

  5. アプリケーションのエンドポイントとは異なるエンドポイントを使用する場合は、エンドポイントの横にある Edit 編集ボタンをクリックします。次に、アプリケーション設定を使用するをオフにして、新しいエンドポイント URL およびその他のオプションを指定します。

  6. アプリケーションの検証方法とは異なる検証方法を使用する場合は、認証の横にある Edit 編集ボタンをクリックします。次に、アプリケーション設定を使用するをオフにして、新しい検証方法を指定します。

  7. 通常、Space が POST リクエストを送信した後、アプリケーションは 200 OK HTTP ステータスで応答する必要があります。デフォルトでは、Space はすべての 2xx コードを成功として扱います。Space が他のコードを成功として受け入れるようにするには、これらのコードを成功した HTTP 応答のステータスコードリストに追加します。

    Space が他のコードを受信した場合、または応答をまったく受信しなかった場合、最大 3 回までリクエストの再送信を試みます。この動作を無効にするには、エンドポイント設定で失敗時の再試行をクリアします。

  8. エンドポイントを構成した後、テストエンドポイントボタンをクリックして構成をテストできます。この場合、Space は PingWebhookEvent ペイロードを含むリクエストを送信します。アプリケーションはこのペイロードタイプを受け入れる必要があることに注意してください。詳細

サブスクリプションを作成する

Webhook を作成したら、追跡する必要があるイベントを Webhook にサブスクライブする必要があります。Webhook には、任意の数のイベントサブスクリプションを含めることができます。

  1. サブスクリプションの横にある Add 追加ボタンをクリックします。

  2. サブスクリプションの名前およびその他の設定を指定します。

    • ソース : 通知を受信する Space モジュール ( チーム課題会議など)。

    • イベント : アプリケーションへの POST リクエストの送信をトリガーするイベント。使用可能なイベントのリストは、選択したソースによって異なります。

    • 追加のフィルター: 追加のイベントフィルターを指定することで、サブスクリプションの範囲を絞り込むことができます。使用可能なフィルターのリストは、選択したソースによって異なります。例: チームでフィルターするプロジェクトでフィルター場所でフィルタリングするなどになります。

    Webhook event subscription
  3. サブスクリプションを作成した後、ペイロードで送信するイベントデータを定義できます。ペイロードサイズを減らすために、Space は必要最小限のデータセットのみを送信します。具体的には、トップレベルのフィールドのみを送信します。

    例: IssueWebhookEvent クラスのペイロードには issue: Issue フィールドがあります。Issue クラスは完全な課題データを提供しますが、デフォルトでは、Space は issue.id フィールドのみを送信します。

    { "className": "WebhookEvent", ... "payload": { "className": "IssueWebhookEvent", ... "issue": { "id": "30PnZX2QSoWo" }, ... } }

    ペイロードの内部を確認するには、ペイロードに移動します。ペイロードの内容を変更するには、ペイロードの横にある Edit 編集ボタンをクリックし、必要なフィールドを選択します。

Webhook とアプリケーションの権限

Webhook が機能し始めるには、アプリケーションに対応する権限が付与されている必要があります。例: ドキュメントが作成されましたイベントのサブスクリプションには文書の表示権限が必要です。

アプリケーション所有者 (アプリケーションをインストールするユーザー) またはアプリケーション自体が Webhook を作成した後、権限承認リクエストが対応する管理者に送信されます。詳細

アプリケーション所有者自身が要求された権限を持っている場合、Space は管理者に連絡することなく自動的に権限を付与します。ただし、これはグローバル権限に対してのみ機能します。つまり、プロジェクトおよびチャットチャネルスコープからの権限には、対応する管理者の承認が依然として必要です。

Webhook イベントデータを URL パラメーターとして送信する

デフォルトでは、Space は HTTP リクエストペイロードでイベントデータを Webhook エンドポイントに送信します。また、Space はデータをエンドポイント URL パラメーターとして送信できます。マクロは、イベントが発生したときに実際のイベント値に置き換えられるプレースホルダーです。例: https://my.endpoint.url/api?id={{member.id}} は、https://my.endpoint.url/api?id=1234 のような実際のユーザー ID に変換されます。

URL マクロを使用するには、デフォルトのアプリケーションエンドポイント URL をカスタムの URL に変更する必要があります。

val webhook = spaceClient.applications.webhooks.createWebhook( // specify a custom endpoint with required macros endpoint = EndpointCreateDTO(" https://myapp.example.com/api/space?issue={{issue}}", false), // other webhook settings // ... )
POST https://mycompany.jetbrains.space/api/http/applications/me/webhooks Authorization: Bearer here-goes-the-access-token Accept: application/json Content-Type: application/json { "name": "Issue and project events", "description": "Track when an issue is created, or a title or a description is updated", "endpoint": { "url": " https://myapp.example.com/api/space?issue={{issue}}", "sslVerification": false }, // other webhook settings // ... }
  1. Webhook 設定を開きます。

  2. Edit 編集ボタンをクリックして、エンドポイント設定を開きます。

  3. アプリケーション設定を使用するチェックボックスをクリアします。

  4. 必要なマクロを使用してエンドポイント URL を指定します。

    現在のコンテキストで使用可能なマクロは、イベントタイプのフィールドに対応します。例: Webhook がブログ投稿が公開されましたイベントにサブスクライブされている場合、Space は BlogWebhookEvent タイプのペイロードを送信します。これは、BlogWebhookEvent タイプのフィールドを URL マクロとして使用できることを意味します。たとえば、ブログ投稿のタイトルを取得するには: https://my.endpoint.url/api?id={{title}}

    エンドポイントの編集ウィンドウには、現在のコンテキストで使用できるマクロのリストが表示されます。

    URL macros

アプリケーションで Webhook 通知を処理する

イベントがトリガーされると、Webhook はアプリケーションのエンドポイントに WebhookRequestPayload を送信します。イベントペイロードの処理を支援するために、Space SDK には多数のクラスが用意されています。ペイロードを処理した後、アプリケーションは 200 OK HTTP ステータスで応答する必要があります。

ここでは、 Webhook ペイロードを処理する方法を示すアプリケーションの例を見つけることができます。

ペイロードの内容

例: このペイロードは、新しいユーザーが組織に追加されたときに送信されます。

{ "className": "WebhookRequestPayload", "accessToken": "", "verificationToken": null, "serverUrl": "https://mycompany.jetbrains.space", "clientId": "a1b83dac-6e26-46cb-b3cb-7e264eab5e9e", "orgId": "o0Ghr0EewX8", // id issued to a webhook during registration "webhookId": "3EZUCW3RmsZY", "payload": { // event class name "className": "ProfileOrganizationEvent", // event-specific data "meta": { "principal": { "name": "admin", "details": { "className": "CUserPrincipalDetails", "user": { "id": "2ZJrHC3ouUQz" } } }, "timestamp": { "iso": "2021-06-15T14:51:35.545Z", "timestamp": 1623768695545 }, "method": "Created" }, "member": { "id": "4Zg1mS4aBsOm" }, "joinedOrganization": true, "leftOrganization": false } }

プロセスイベントペイロード

イベントペイロードの処理を支援するために、Space SDK はいくつかのクラスを提供します。イベントタイプごとに個別のクラスです。これらすべてのクラスは WebhookEvent インターフェースを実装します。イベントクラスのフィールドを使用すると、イベントペイロードから特定のデータを取得できます。イベントクラスの完全なリストは API 参照にあります。

例: 組織に参加したメンバーイベントの Webhook を作成できます。この場合、新しいユーザーが組織に追加されるたびに、Space は ProfileOrganizationEvent クラスのインスタンスをアプリケーションに送信します。そのフィールドを使用して、追加されたユーザーに関するデータを取得できます。

if (event is ProfileOrganizationEvent) { // get id of the created member from event val userId = event.member.id // use id to get username val username = userId.let { val profile = spaceClient.teamDirectory.profiles. getProfile(ProfileIdentifier.Id(userId)) println("ADDED USER: ${profile.username}") } }

Space UI で Webhook を作成すると、Webhook にサブスクリプションを追加するときに、特定のイベントクラスに関する詳細情報を取得できます。

Webhook 接続のテスト

Webhook を追加する場合、エンドポイントページのテストエンドポイントボタンを使用してアプリケーションへの接続をテストできます。

Test endpoint

これにより、PingWebhookEvent クラスのペイロードが送信されます。アプリケーションでこのイベントタイプを処理するようにしてください。

{ "className": "WebhookRequestPayload", "accessToken": "", "verificationToken": null, "serverUrl": "https://mycompany.jetbrains.space", "clientId": "135d429f-4d7e-4aa1-9872-ea5ba0b6736e", "orgId": "o0Ghr0EewX8", "webhookId": "1HArWk184jyL", "payload": { "className": "PingWebhookEvent", "webhookName": "MyFirstWebhook" } }

Webhook ペイロードをカスタマイズする

リクエスト本文をカスタム形式で送信するように Webhook を構成できます。これは、特定のリクエスト形式のみを受け入れる確立されたシステムと Space を統合する場合に便利です。このような統合の例としては、Slack チャネルにメッセージを送信する Webhook が挙げられます。

Webhook でカスタムペイロード形式を使用するには、Web フックに形式テンプレートを提供する必要があります。これは、Webhook を作成または編集するときに実行できます。

val webhook = spaceClient.applications.webhooks.createWebhook( // use the Slack message format for the request body payloadTemplate = """ { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "{{message.author.name}} said \\"{{message.text}}\\"" } } ] } """.trimIndent(), // other webhook settings // ... )
POST https://mycompany.jetbrains.space/api/http/applications/me/webhooks Authorization: Bearer here-goes-the-access-token Accept: application/json Content-Type: application/json { "name": "Message webhook", "description": "Sends a message to a Slack channel", "payloadTemplate": "{\"blocks\": [{\"type\": \"section\",\"text\": {\"type\": \"mrkdwn\",\"text\": \"{{message.author.name}} said \\\\\"{{message.text}}\\\\\"\"}}]}", // other webhook settings // ... }
  1. Webhook 設定を開きます。

  2. Edit 編集ボタンをクリックして、ペイロード設定を開きます。

  3. ペイロードの編集ウィンドウで文字列テンプレートに切り替えます。

  4. リクエスト本文のテンプレートを指定し、保存をクリックします。

テンプレート形式

  • テンプレートは、テキストと変数を含めることができる文字列です。

  • 変数はイベントデータを表し、Webhook がトリガーされるとその値に置き換えられます。

  • 変数を参照するには、構文 {{variableName}} を使用します。JSON オブジェクトの一部である変数を参照するには、ドット表記法 {{objectName.variableName}} を使用します。例: 課題イベントの場合、{{issue.title}} は課題のタイトルに置き換えられます。

  • 標準 Webhook ペイロードで使用可能な変数のみを使用できます。例: Space UI で Webhook を作成した場合、payload ノードのペイロードセクションで使用可能なフィールドを表示できます。詳細

    Template variables
  • 変数が使用できない場合、Webhook は予期される変数値の代わりに空の文字列を返します。

  • エスケープにはバックスラッシュ \ を使用します: \{\}\\

  • 例: 次のテンプレートは Slack ブロックキットを使用します。

    { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "The issue \\"{{issue.title}}\\" was created by {{issue.createdBy.name}}" } } ] }

サンプル: Webhook を使用して Slack にメッセージを送信する

この例では、Space で課題が作成されたときに Slack チャネルにメッセージを送信する Webhook を作成します。

  1. Slack アプリを作成し、ワークスペースにインストールします(英語)

  2. Slack アプリ設定に移動し、受信 Web フックページを開きます。

  3. ワークスペースに新しい Web フックを追加するをクリックしてチャンネルを選択します。

  4. Webhook URL をコピーします。

    Incoming webhook in Slack
  5. Space でアプリケーションを作成します

  6. Webhook をアプリケーションに追加します

  7. アプリケーションのエンドポイントとして、Slack Webhook URL を指定します。

  8. Webhook サブスクリプションを作成する :

    • ソース : 課題

    • イベント : 作成日

  9. ペイロードで、「 Edit 編集」ボタンをクリックします。

  10. 文字列テンプレートに切り替えて、次のテンプレートを指定します。

    { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "The issue \\"{{issue.title}}\\" was created by: \\n*{{issue.createdBy.name}}*" } } ] }

Space で課題が作成されると、Webhook は Slack チャネルにメッセージを送信します。

Message in Slack

カスタム HTTP ヘッダーを追加する

Space を使用すると、アプリケーションに送信されるリクエストのヘッダーをカスタマイズできます。通常、アプリケーションが非標準の認証 / 認可フローを使用する場合、これは意味があります。

  1. Web フックタブで、必要な Webhook を開きます。

  2. カスタムヘッダーの横にある Add 追加ボタンをクリックします。

  3. ヘッダーの名前を指定し、そのを提供します。

  4. 保存をクリックします。

Webhook リクエスト履歴を表示する

Space UI で作成した Webhook の場合、アプリケーションに送信されたリクエストの履歴を確認できます。

  1. Web フックタブで、必要な Webhook を開きます。

  2. 最近の納品タブを開きます。

関連ページ:

複数組織アプリケーションの配布

マルチ組織アプリケーションは、複数の Space 組織にインストールできるアプリケーションです。組織ユーザーは、直接リンクをクリックするか、JetBrains マーケットプレイスを使用してアプリケーションをインストールできます。アプリケーションを複数の組織で使用できるようにするには、Space API 呼び出しを介して特定の組織内でアプリケーション自体を構成できる必要があります。アプリケーション構成の詳細については、こちらを参照します。複数組織アプリケーションの詳細:クライアントクレデンシャル...

単一組織アプリケーションの登録

アプリケーションの登録は、単一組織アプリケーションを Space インスタンスにインストールする主な方法です。アプリケーションを登録するときは、認可フロー、必要な権限、アプリケーションのエンドポイントなどの設定を手動で指定します。アプリケーションを Space インスタンスに追加する:メインメニューで、「拡張」をクリックし、「インストール済み」を選択します。新しいアプリをクリックします。指定: ユニークなアプリケーション名前。アプリケーションメール。アプリケーションが Space リポジトリにコ...

Space からのリクエストを検証する

アプリケーションが Space からリクエストを受信することになっている場合 (たとえば、エンドポイントでリクエストをリッスンするチャットボット)、受信したリクエストが本物かどうかを検証できる必要があります。Space では、さまざまな検証方法が提供されます。(推奨) 公開鍵、署名キー、(廃止された) 検証トークン、SSL クライアント証明書、HTTP 認証、(推奨) 公開鍵:この検証方法は非対称暗号化に基づいています。最も安全なものとして使用することをお勧めします。Space SDK は、こ...

権限のリクエスト

特定の Space エンドポイントにアクセスするには、アプリケーションはまず対応するアクセス許可を取得する必要があります。例: アプリケーションがプロジェクトの課題を作成する場合、アプリケーションには課題の作成権限が必要です。課題の詳細を表示するには、課題を表示する権限が必要です。アプリケーションに必要な権限のセット全体は、権限スコープと呼ばれます。アプリケーションがアクセス許可を要求する方法は、アプリケーション自体の代わりに動作するアプリケーションと、Space ユーザーの代わりに動作するアプ...

アプリケーションを配布する

Space アプリケーションには、ディストリビューションタイプに応じて、単一組織アプリケーションと複数組織アプリケーションの 2 つのタイプがあります。単一組織アプリケーション:これらは、単一の Space 組織にのみインストールされるアプリケーションです。例: これは、内部使用のみを目的として組織によって開発されたアプリケーションである可能性があります。単一組織アプリケーションのもう 1 つのケースは、まだ開発中のアプリケーションです。開発者としては、まず Space インスタンスでアプリケ...