ServiceNow GraphQL: 既存のスキーマにリクエスト送ってみよう

ServiceNowにはアプリケーションを作るとHTTP越しにCRUDができるようになるテーブルAPI (一般的なREST API)、コーディングでカスタムのエンドポイントを作れるScripted APIがあります。GraphQLはScripted APIに似ていて、設定しないと使えません。

ServiceNowのGraphQL関連のドキュメントはこちら。

既存のスキーマを調べてみよう

まずは既存のスキーマにどんなものがあるか確認します。

画面左のナビゲーションバーから [GraphQL APIs] を見つけて開きます。
検索フィールドで [graphql] と入れると見つけやすいです。

GraphQL APIsの探し方

あんまり登録されていなかったです。

スキーマ一覧

とりあえず叩いてみる

とりあえず叩いてみて後で内容を読み込んでみましょう。
一番シンプルな user を使います。
GraphQLクライアントにはFirefoxのアドインのAltairを使ってみました。

URLはこちらです。

https://<ご自身のインスタンスID>.service-now.com/api/now/graphql

標準のGraphQLマニュアルと比較してServiceNowの方がSchema namespaceとApplication Namespaceが追加になる分、階層が深くなります。
ヘッダーは context-type: application/json ですがAltairはその辺よしなにやってくれました。

クエリ (Body)

結果。presence オブジェクトの user_available 属性の値 true を取ることができました。

レスポンス (Body)

Schema Definition Language (SDL) を真面目に読んでみる

では設定の内容を読み込んで、いったい私は何のデータを取得したのか理解してみます。
ServiceNowの user スキーマの Schema フィールドの内容をコピってきました。

schema {
    query: Query
}

type Query {
	presence: Presence
	encryptionContexts: [EncryptionContext]
}

type EncryptionContext {
	name: String!
	sysId: ID!
}

type Presence {
	user_available: Boolean @source(value: "user_available.display_value")
}

これはGraphQL標準のSDLで書かれています。
したがってこれを理解するために読み込むべきなのはServiceNowのマニュアルではなくGraphQLのマニュアルです。

ReadなのかReadWriteなのか

最初の部分はReadなのかReadWriteなのかが記載されています。
queryがRead、mutationがWriteだと思っていただくと良いと思います。
userの場合はqueryとしか書いてませんので、ReadのみでWriteできません。

schema {
    query: Query
}

フィールド一覧

次はqueryで取り扱うフィールド一覧です。
presenceフィールドとencryptionContextsフィールドが登録されています。
コロン [:] を挟んでpresenceフィールドはPresenceオブジェクトに、encryptionContextsフィールドは [EncryptionContext] オブジェクトにマップされています。[…] は配列を意味します。

type Query {
	presence: Presence
	encryptionContexts: [EncryptionContext]
}

属性一覧

最後にオブジェクトの属性の一覧です。
ここではpresenceオブジェクトを見てみます。
boolean型の user_available という属性が登録されています。
@source 以下は値をどこから持ってくるかが書かれています。user_available属性のServiceNow画面上の表示用の値 (true/false) が指定されています。

type Presence {
	user_available: Boolean @source(value: "user_available.display_value")
}

なお [user_available.display_value] はServiceNowの "dot-walk" と呼ばれる表現形式で、スクリプト内で使用します。このように表示形式に指定されているフォーマットを呼び出したり、JOINが定義されている場合は連携先テーブルのカラムを指定したりするときに使用します。便利です。

元データを探してみる

元データを探るには画面の下にあるタブ群の中から [GraphQL Scripted Resolver] 内の [Presence Resolver] を読んでみます。

ServiceNowのAPIリファレンスはこちらをどうぞ。
このドキュメントでは言語のライブラリ的な意味のAPIとHTTPの上に乗るAPIとの両方を "API Reference" としてまとめているのでわかりにくいと評判。

gs.getUserID() を使ってAPIを叩いたユーザーを特定し、sys_user_presence テーブルでuserカラムの値がAPI実行ユーザーのレコードがあるかどうかを確認した上でpresenceを返していますね。
では元データはsys_user_presenceテーブルです。

(function process(/*ResolverEnvironment*/ env) {

	var userId = gs.getUserID();
	var presence = new GlideRecord('sys_user_presence');
	presence.get('user', userId);
	
	return presence;

})(env);

ServiceNow画面上のナビゲーションバーの検索フィールドに [sys_user_presence.list] と入れて開いてみます。
取れたのはここの値ですね!

User Presenceテーブル

ユーザーの行動履歴っぽい感じのデータが見えます。

User Presenceテーブルのデータ

ServiceNowのユーザーが現在オンラインかどうかを判定するためのテーブルだそうです。スキーマ一覧を見ると他にチャットに関するスキーマがいくつかありましたので、チャットのオンライン状態を表示するためのものだと思います。

上記の画面で見る限りuser_availableの他も属性があります。
ただしGraphQLのスキーマで公開しているのはuser_availableだけです。
ですので他の属性を指定して実行しても値は取れない。
例えばpathを指定してみると、スキーマに設定されていないのでエラーで返ってきます。

path取得結果

余談ですがカラムの正式なカラム名 (user available に対する user_available) はテーブル定義の画面で確認できます。
画面左上の3本線 (いわゆるハンバーガー) > Configure > Table

Table定義画面の開き方

開いた画面の下の方にあるタブ群の [Columns] タブ以下にある目的の属性をクリックし、[Column name] に書いてあります。

この記事が気に入ったらサポートをしてみませんか?