ServiceNow GraphQL: 既存のスキーマにリクエスト送ってみよう
ServiceNowにはアプリケーションを作るとHTTP越しにCRUDができるようになるテーブルAPI (一般的なREST API)、コーディングでカスタムのエンドポイントを作れるScripted APIがあります。GraphQLはScripted APIに似ていて、設定しないと使えません。
ServiceNowのGraphQL関連のドキュメントはこちら。
既存のスキーマを調べてみよう
まずは既存のスキーマにどんなものがあるか確認します。
画面左のナビゲーションバーから [GraphQL APIs] を見つけて開きます。
検索フィールドで [graphql] と入れると見つけやすいです。
あんまり登録されていなかったです。
とりあえず叩いてみる
とりあえず叩いてみて後で内容を読み込んでみましょう。
一番シンプルな user を使います。
GraphQLクライアントにはFirefoxのアドインのAltairを使ってみました。
URLはこちらです。
https://<ご自身のインスタンスID>.service-now.com/api/now/graphql
標準のGraphQLマニュアルと比較してServiceNowの方がSchema namespaceとApplication Namespaceが追加になる分、階層が深くなります。
ヘッダーは context-type: application/json ですがAltairはその辺よしなにやってくれました。
結果。presence オブジェクトの user_available 属性の値 true を取ることができました。
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] と入れて開いてみます。
取れたのはここの値ですね!
ユーザーの行動履歴っぽい感じのデータが見えます。
ServiceNowのユーザーが現在オンラインかどうかを判定するためのテーブルだそうです。スキーマ一覧を見ると他にチャットに関するスキーマがいくつかありましたので、チャットのオンライン状態を表示するためのものだと思います。
上記の画面で見る限りuser_availableの他も属性があります。
ただしGraphQLのスキーマで公開しているのはuser_availableだけです。
ですので他の属性を指定して実行しても値は取れない。
例えばpathを指定してみると、スキーマに設定されていないのでエラーで返ってきます。
余談ですがカラムの正式なカラム名 (user available に対する user_available) はテーブル定義の画面で確認できます。
画面左上の3本線 (いわゆるハンバーガー) > Configure > Table
開いた画面の下の方にあるタブ群の [Columns] タブ以下にある目的の属性をクリックし、[Column name] に書いてあります。
この記事が気に入ったらサポートをしてみませんか?