Service NowでTable APIを使ってみる

こんちは
今年の四月から新社会人として社会の荒波？にもまれています。
最近業務で扱い始めたServiceNowについて開発の側からすこしアウトプットしていこうと思います。
#Service Now？
最近、会社自体の成長が話題のService Nowですが日本ではNTTコミュニケーションズが東京と大阪のデータセンターを2019年から運用を開始したことは大きかったと思います。Service Nowの提供するNow Platformに話を移しますが、これについて少し触った感触からいうなら、高機能なクラウド上のデータベースといったところでしょうか。私もまだ触り始めたばかりではありますが今のところの感想も含めこんな感じの印象です。
↓こんな感じでテーブルを参照したり、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/d98677ae-3ad4-0cf3-2edc-7f62e4be11b2.png">
↓レコードを編集したりできます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/4619be55-deaa-51a0-2c23-279527121506.png)

そのほかスクリプトが使えるので自動でメールを飛ばす設定を入れたり、その他外部のAPIを使ってデータを収集してテーブルに反映したりと様々なことができます。

#本記事では
ServiceNowのDeveloperアカウントを取得し、簡単なアプリケーションの立ち上げとテーブルの追加をしたのち、テーブルの情報をAPIを用いて`curl`コマンドで取得するところまでの流れを説明します。
参考：[ServiceNow Developerサイト](https://developer.servicenow.com/dev.do#!/)

#Developer アカウントの取得
まずはともあれ、Now Platformを試すにはDeveloper Instanceを立てる必要があります。DeveloperアカウントをとってDeveloper Instanceを立てるだけなら無料なので気軽に試すことができます。
####まずはDeveloperサイトにアクセスしてSign up
そのまんまです。そんなに難しいUIではなかったので特別注意することはないと思います。
まずはSign inをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/219d7246-ae5f-c677-e43d-e5705f4fe504.png)
Get a ServiceNow AccountをクリックしてRegisterをクリックして必要項目を入力してSign upでアカウントを作れます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/03373ab0-9f65-f888-473f-eee883a0cd71.png" width=33%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/da596490-5e70-2308-6859-ae8b7483508c.png" width=33%><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/fe7669a1-9470-142f-38af-afdc6b8c899f.png" width=34%>
Sign up後入力したメールアドレスに届いたメールでVerify Emailをクリックしてメールアドレスを承認すれば、完了です。



必要なのはService Nowからのメールを受け取るためのアドレスがあれば大丈夫です。
###Developer Instanceを立てる
先ほど作ったDeveloperアカウントで早速ログインして、そしたら右上の`Request Instance`のボタンを押しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/9247e8a5-fe0c-e9f4-80e7-c75af2620745.png)

#アプリケーションを作る
ServiceNowでは基本的にはアプリケーションという単位でテーブルやそれに付随される様々な機能やスクリプトを管理します。
developerインスタンスでは最初からサンプルでIncidentといったアプリケーションが入っておりチュートリアルなどでよく参照されるので要チェックかもしれないです。
新たにアプリケーションを作るにはここの検索フォームっぽいこのナビゲーションバーに`Studio`と入れてStudioを検索して起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/b60bc177-67d1-b9e0-b055-a87f9ad1c463.png)
初めてStudioを立ち上げるとアプリケーションを作成する流れとなるので説明に沿ってやっていけばとりあえずの箱としてアプリケーションを作ることができます。
最初にStudioを立ち上げるとアプリケーションを作成する画面にてまずアプリケーションの名前を設定します。
Nameの欄を埋めるとScopeの欄は自動で入ります。（スコープはシステム内でのこのアプリを識別する名前です。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/ad3118df-ac08-0820-065d-a410772a56ae.png" width=70%>
名前を決めたら次はアプリケーションで使うロールを決めます。
ロールは様々な権限それ自体をオブジェクトにしたようなものであると自分は認識しています。ユーザーやグループに割り振ることで利用者間での権限に差異を持たせることができます。
既存のロールを適用することもできますし、このアプリケーションで独自のロールを作ることもできます。
管理のためには独自のロールを作っておくのがよいのかなと思っています。

次にアプリの使う形態を決めます。
ここはServiceNowのモバイルアプリなど使う場合は気を付けたいですが今は使わないのでとりあえず`Classic`にチェック入れておけば大丈夫です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/9699cfd7-4395-9c57-f002-c4e2ac21d7df.png">

それからアプリのテーブルを定めます。既存のテーブルを使うことできますし、新たにテーブルを作ることも(Create new table)、またテーブル作成を後回しにすることもできます(Continue in Studio(Advanced))。
テーブルの作成ではエクセルのシートを読み込んで作ることもできるのですでに別形式でデータがある場合はこれで作るのもよいかもしれません。ですが今回はここはスルーしたいので`Continue in Studio`をクリックします。（ここわかりづらいんですけど下線部の方です。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/4ab1cf16-89cc-c8b1-5436-58fdff03e162.png"　width=60%>

そうするとWelcome to StudioということでStudioのメインの画面に来ます。
今はまだ何もファイルを作っていないので左のメニューにはまだ何も入っていないですがこれからテーブルを作ったりするといろいろ入ってきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/09e210e9-304c-c854-4457-24b2cf5ef316.png">
##テーブルを作る
では、ここからはServiceNow上でテーブルを作ってみます。先ほどの画面で`Continue in Studio`を選択し、一度Studioに入った状態から作っていきます。（最初アプリ立ち上げ時に`Create new table`を選択して作るときは微妙に画面が異なるので注意してください。）
左上にある`Create Application File`をクリックして出てきたポップアップからTableを選択し、Createボタンをクリックすると`New Table`が作成されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/eb993fcd-7dbc-f374-f8f6-ad00eeab46d6.png" >
先ほどのCreateボタンを押すと、Tableの設定を行うフォームが開かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/7ad580d7-8335-4aca-530c-b71512a1d1c9.png)
ここで設定必須なのは、`Label`と`Name`です。
`Label`は表示名、`Name`がシステムで使う識別名です。
`Label`を入力すると`Name`の部分が自動で入力されます。`Label`の大文字はすべて小文字になりスペースはアンダースコアに変換されます。`Name`はアプリの中で一意になるものなのでコンフリクトするとえらいことになります~~Submitできないだけ~~、注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/6176425b-51f0-3969-2b67-1c0a49999569.png)
必須項目の入力が終わったら`Columns`をどんどんつくっていきます。
`Columns`はデフォルトで以下の6つの項目が入っています。これらデフォルト項目は自動で決まってくる値なので特に編集を入れずともレコード追加を行った際には勝手に値が入っていきます。
それでは下にある`Insert a new row`から新たに`Column`を追加をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/06bcac28-844a-09d0-71f5-d2213dc8afd6.png)

適当にいろいろ作ってみました。
`Device`と`Zipcode`と`Language`を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/007bd310-6505-5107-46a0-30811e6be677.png)
#レコードを入れる
続いて先ほど作ったテーブルにレコードを追加するためこの編集内容でテーブルを`Update`したのちStudioからインスタンスに戻って追加をしていきます。
インスタンスのナビゲーションバーから先ほど作った`Test table`を検索します。
まだ一つもレコードがないのでNo record to displayの状態ですが、上にあるNewのボタンからどんどん追加していくことができるので追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/6d42d8d8-e935-e98d-e0a1-778fbb08df9b.png)
レコード追加の画面はこんな感じです。
`Submit`のボタンを押せばレコードの追加ができます。
この入力の画面の配置も編集ができるので用途に合わせていろいろな形を作ることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/52cee570-30f0-6fd3-72a2-83396a04d673.png)
適当にいろいろレコードを入れてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/38985840-df4c-d770-fe74-278b1379ed12.png)
では次はこのTest tableに入れたレコードを`curl`コマンドを使って外からとってこようと思います。

#REST API Explorerを使う
ServiceNowは難しいスクリプトなどはなしでGUI操作から簡単にREST APIを試すことができます。
まずはナビゲーションバーからREST API Explorerを検索し、開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/62349a9f-dffd-4b04-e3ba-398aad23e644.png)
続いてREST API Explorerを設定していきます。
`NameSpace`をnow
`API Names`をTable API
`API version`はlatestを選び、tableNameは先ほど作ったTest tableを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/e4c8aa58-17a3-036d-2755-8b96b085a1ad.png)

そしたら今回はお試しなので特に変更は入れずに下にある`Send`ボタンを押してRequestを送ります。
そうするとすぐその下に結果が帰ってきます。
Resposeの`Status code`の部分が200 OKとなれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/13a845c7-eddc-2fea-f361-91da0ec8d7f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/1c227667-4c5c-9b60-62fa-bc7d4003ffdb.png)
↑のようなJson形式のRespose BodyをWeb上で確認することができるだけでなくPython, Ruby, JavaScript, Powershellなどの様々なプログラム言語に対応したCode Sampleまで自動で作ってくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/5c1f51d1-03f7-c467-db4f-75c5d6e0e017.png)

今回はcURLのスクリプトをcommand lineから実行していきたいと思います。
Code SampleのcURLをクリックすると以下のようなCode Sampleのポップアップが表示されるのであとはこれをコピペしてパスワード情報を直してあげればもうできてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402157/bc556847-bc67-a9fd-7b08-558b1299eb63.png)

早速試してみました。
以下結果です。うまいこといきましたね！

```terminal
[linux@localhost]$ curl "https://dev.service-now.com/api/now/table/x_542597_sample_test_table?sysparm_limit=10" --request GET --header "Accept:application/json" --user 'admin':password|jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1883    0  1883    0     0   1892      0 --:--:-- --:--:-- --:--:--  1890
{
  "result": [
    {
      "zipcode": "1100000",
      "sys_id": "084b7e462fcd64101741b2e72799b660",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:10:03",
      "sys_mod_count": "0",
      "language": "Japanese",
      "sys_updated_on": "2020-12-14 15:10:03",
      "sys_tags": "",
      "device": "pc",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "7700000",
      "sys_id": "47bc3e462fcd64101741b2e72799b65e",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:16:16",
      "sys_mod_count": "0",
      "language": "Suomi",
      "sys_updated_on": "2020-12-14 15:16:16",
      "sys_tags": "",
      "device": "tablet",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "8800000",
      "sys_id": "98dcbe462fcd64101741b2e72799b6d4",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:16:42",
      "sys_mod_count": "0",
      "language": "Polski",
      "sys_updated_on": "2020-12-14 15:16:42",
      "sys_tags": "",
      "device": "smart phone",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "3300000",
      "sys_id": "b06cf6462fcd64101741b2e72799b648",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:15:16",
      "sys_mod_count": "0",
      "language": "Norsk",
      "sys_updated_on": "2020-12-14 15:15:16",
      "sys_tags": "",
      "device": "pc",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "4400000",
      "sys_id": "b49c7a462fcd64101741b2e72799b650",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:15:39",
      "sys_mod_count": "0",
      "language": "Deutsch",
      "sys_updated_on": "2020-12-14 15:15:39",
      "sys_tags": "",
      "device": "smart phone",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "2200000",
      "sys_id": "ec6b3e462fcd64101741b2e72799b644",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:14:24",
      "sys_mod_count": "0",
      "language": "Chinese",
      "sys_updated_on": "2020-12-14 15:14:24",
      "sys_tags": "",
      "device": "smart phone",
      "sys_created_by": "admin"
    },
    {
      "zipcode": "6600000",
      "sys_id": "f2acbe462fcd64101741b2e72799b6bc",
      "sys_updated_by": "admin",
      "sys_created_on": "2020-12-14 15:15:58",
      "sys_mod_count": "0",
      "language": "Magyar",
      "sys_updated_on": "2020-12-14 15:15:58",
      "sys_tags": "",
      "device": "tablet",
      "sys_created_by": "admin"
    }
  ]
}

```

これでServiceNowのテーブルのデータが外部から参照できるようになりましたね。
これさえできればここから様々な形に広げられるかと思います。
いろいろ試していきたいところです。
ここまで読んでいただきありがとうございました。

ServiceNow最新のバージョンのドキュメントが英語しかなくてつっかえまくってしまいました。。。
もう少し学生時代に英語勉強すればよかったなと思います。
URL隠すの忘れましたが、もうインスタンスを壊したので大丈夫です。
誤字脱字がまだ追いきれてないのでそこはご愛嬌ということでここはひとつよろしくお願いします。