先ずはNASAのOpen APIページに行き、APIキーを取得しましょう。
APIキーが取得できたら、今度はどのAPIを利用するかを選びます。
今回はBrowse APIs
ページからMars Rover Photosを選びました。
+ 符号をクリックして、使用説明文を表示させます。エンドポイントのURLといくつかのパラメータの説明があります。
Example Queriesの一番最初の例を使用します。
核となるタスクの作成
Sharperlightスケジューラタスクを使用して、NASAの写真データを取得してみます。
Sharperlightアプリケーションメニューからスケジューラを起動します。
新規
ボタンで新しいタスクの作成を開始します。
タスクのダイアログが起動したら、コードとグループを決定します。
次にアクション
タブに移動して、実際にタスクに課す仕事を定義します。
ここでは、クエリビルダを使用して先ほど選択したAPIエンドポイントからデータを取得し、あらかじめ準備したローカルのデータベースに保存するといった一連の作業を定義します。
クエリの組み合わせアクション
アクション
タブの新規アイコンでアクション一覧を表示させ、クエリの組み合わせを選択します。
クエリの組み合わせアクションが追加されると、クエリを編集
ボタンで先ほど選択したAPIエンドポイントに対するクエリを作成します。
起動するクエリビルダでは、
- モード:詳細レポート
- 製品:システム
- テーブル:Web ページのテーブル、CSV、JSON、XML またはOData
- URLリンク:(Example Queriesの一番最初の例)
https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos?sol=3495&page={@Page}&api_key=あなたが取得したAPIキー
パラメータsolの値を3495
に、更にpageパラメータを追加しました。
page番号はこのクエリに対する引数として渡すよう設定します。
また、戻ってくるJSON形式のデータのどの位置から解析するかを、開始位置フィルターに指定します。
URLリンクフィルターにURLを記入すると、Sharperlightエンジンが実際にそのURLにアクセスし、戻ってくるデータを解析し、選択可能なフィールド一覧を選択
領域に表示してくれます。
ここでは、camera列やrover列は、更にJSONデータ形式のままなので、拡張表現を利用してそれぞれの値を取り出します。
この方法で戻ってくるデータをいくつかの列に分解します。
各出力列には名前をつけて、保存する際にその名前で参照できるようにします。属性欄の%のついた文字列がその列の参照名です。%RoverIdや%RoverName
プレビューでクエリの動作確認を行います。
データが返ってきました。
OK
ボタンでクエリを保存します。
SQLステートメントアクション
次に新規アクションとしてSQLステートメントアクションを追加します。
先に作成したクエリの組み合わせアクションは、For文のような働きをし、取得したデータを一行ずつその次のアクションに渡し処理させます。
ここではSQLステートメントアクションで一行ずつデータベースに書き込むようにします。
今回は前もってデータベースとテーブルを作成し、そのデータベースに対するSharperlight用のデータモデルを作成しておきました。もちろんクライアントのセットアップでそのデータベースとの接続も完了しています。
よって、SQLステートメントアクションでは下図のように、その接続を利用してSQL文を発行することが可能です。
あとは、クエリの組み合わせアクションから渡される値を、データベースに書き込むためのSQL文をこのように定義するだけです。
クエリの組み合わせアクションから渡される値は全て{%xxxxxx}
で参照できます。
UPDATE [dbo].[MarsPhoto]
SET [Rover_Raw]='{%RoverRaw}'
,[Rover_Id]={%RoverId}
,[Rover_Name]='{%RoverName}'
,[Rover_LandingDate]='{%RoverLandingDate}'
,[Rover_LaunchDate]='{%RoverLaunchDate}'
,[Rover_Status]='{%RoverStatus}'
,[Camera_Raw]='{%CameraRaw}'
,[Camera_Id]={%CameraId}
,[Camera_RoverId]={%CameraRoverId}
,[Camera_Name]='{%CameraName}'
,[Camera_FullName]='{%CameraFullName}'
,[ImageURL]='{%ImageURL}'
,[EarthDate]='{%EarthDate}'
WHERE [Id]={%id};
IF @@ROWCOUNT=0
BEGIN
INSERT INTO [dbo].[MarsPhoto]
([Id]
,[Rover_Raw]
,[Rover_Id]
,[Rover_Name]
,[Rover_LandingDate]
,[Rover_LaunchDate]
,[Rover_Status]
,[Camera_Raw]
,[Camera_Id]
,[Camera_RoverId]
,[Camera_Name]
,[Camera_FullName]
,[ImageURL]
,[EarthDate])
VALUES
({%id},'{%RoverRaw}',{%RoverId},'{%RoverName}','{%RoverLandingDate}','{%RoverLaunchDate}','{%RoverStatus}'
,'{%CameraRaw}',{%CameraId},{%CameraRoverId},'{%CameraName}','{%CameraFullName}','{%ImageURL}','{%EarthDate}')
END
これでこのアクションの定義は終了。
クエリの組み合わせ終了アクション
最後に新規アクションとしてクエリの組み合わせ終了アクションを追加します。
これはFor文を閉じる的な意味合いのアクションで、クエリの組み合わせアクションと必ず対を成す必要があります。
以上で取得および書込みタスクの作成は終了。OK
で保存します。
核となるタスクをページ数分繰り返す親タスクの作成
次に、もう一つタスクを作成して、先に作成したタスクをページ番号毎に繰り返し実行できるようにします。
新規タスクを作成し、クエリの組み合わせアクションを利用して、ページ番号が1から20までを返すクエリを定義します。
そしてそのクエリの組み合わせアクションのForループ内で、先に作成した核となるタスクを実行するといった具合です。その際にページ番号を引数として渡します。
最後にクエリの組み合わせ終了アクションをお忘れなく。
OK
で保存します。
タスクの実行
スケジューラダイアログで、親タスクを選択し、右クリックメニューから実行を選択します。
エラー無く実行が終了すると、接続したデータベースの指定したテーブルにはNASA Open APIから取得したデータが保存されているはずです。