Web 系アプリ開発のど素人がチャレンジする WebAPI 連携日記の第 4 回です。
前回に引き続き、気象庁の天気予報に関してです。前回は、Web サイトの仕組みやデータの取得方法、構造について整理しました。今回はその情報を使用して、ノーツで天気予報を取得するサンプルを紹介します。
サンプルプログラム
指定したエリアの天気予報を取得し、メッセージボックスで表示するだけの単純なエージェントです。メインルーチンは次の通りです。
|
Option Declare Private xns As NotesSession Sub Initialize Dim sAreaCD As String Dim vWeather As Variant Set xns = New NotesSession '大阪の天気予報を取得 sAreaCD = "270000" Call xGetForecast(sAreaCD, vWeather) MsgBox Join(vWeather, Chr(10)), 64, "大阪の天気予報" End Sub |
エリアコードを指定して天気予報を取得する関数をコールします。戻り値の vWeather は文字列型の配列となる前提で、それをメッセージボックスで改行区切りで表示します。
天気予報の取得
天気予報を取得する関数は次の通りです。
引数で指定したエリアコードを使用してコールする URL を生成してから HTTP リクエストを実行しています。今回の API では、メソッドは Get となります。また、レスポンスは JSON を前提としています。
| Function xGetForecast(ByVal vsAreaCD As String, rvWeather As Variant) Dim sURL As String Dim http As NotesHTTPRequest Dim jnav As NotesJSONNavigator Dim je3 As NotesJSONElement '天気予報の JSON を取得 sURL = "https://www.jma.go.jp/bosai/forecast/data/forecast/" & vsAreaCD & ".json" Set http = xns.CreateHttpRequest() http.PreferJSONNavigator = True Set jnav = http.Get(sURL) '明後日までの天気予報の取得 Set je3 = jnav.GetFirstElement() Call xGetForecast_3Days(je3, rvWeather) End Function |
返される JSON には、2つのオブジェクトがあり、明後日までの天気予報と週間天気予報となっていました。今回は、明後日までの天気予報を取得するので、1つ目のオブジェクト(エレメント)を取得しています。
実際に天気予報を取得するプログラムは、サブ関数 xGetForecast_3Days で行います。
明後日までの天気予報の取得
この部分は JSON の構造が少し複雑なので、取得したい天気予報(weathers)までの構造を改めて掲載します。
取得までの流れとしては、まず timeSeries を取得して、次に areas を取得、その中に目的の weathers が存在します。それぞれが配列の構造となっているので、段階を踏んで取得する必要があります。
具体的なプログラムは下記の通りですが、各段階の処理は理解しやすいようにコードをそろえるようにしました。流れとしては、
- エレメントを名称(キー)で検索し、NotesJSONElement オブジェクトとして取得
- 配列であるか確認
- 1つ目の要素を取得し、NotesJSONObject オブジェクトとして取得
としています。
|
Function xGetForecast_3Days(vje3Days As NotesJSONElement, rvWeather As Variant) Dim jeTmp As NotesJSONElement Dim jobjTmp As NotesJSONObject Dim jaTmp As NotesJSONArray Set jobjTmp = vje3Days.Value Set jeTmp = jobjTmp.GetElementByName("timeSeries") If jeTmp.Type = Jsonelem_type_array Then '配列の1つ目が天気予報 Set jaTmp = jeTmp.Value Set jeTmp = jaTmp.GetFirstElement() Set jobjTmp = jeTmp.Value 'エリア(areas)を取得 Set jeTmp = jobjTmp.GetElementByName("areas") If jeTmp.Type = Jsonelem_type_array Then '配列だが1つしか要素がない Set jaTmp = jeTmp.Value Set jeTmp = jaTmp.GetFirstElement() Set jobjTmp = jeTmp.Value '天気 Set jeTmp = jobjTmp.GetElementByName("weathers") rvWeather = xGetArray_String(jeTmp) End If End If End Function |
目的のオブジェクト weathers を取得した後は、その中身を配列に変換する関数を xGetArray_String をコールしています。
| Function xGetArray_String(vje As NotesJSONElement) As Variant Dim jaVal As NotesJSONArray Dim jeVal As NotesJSONElement Dim i As Integer Dim vTmp As Variant If vje.Type = Jsonelem_type_array Then Set jaVal = vje.Value ReDim vTmp(jaVal.Size-1) For i = 1 To jaVal.Size Set jeVal = jaVal.Getnthelement(i) vTmp(i-1) = CStr(jeVal.Value) Next End If xGetArray_String = vTmp End Function |
まとめ
実行すると次のように、取得した天気予報を表示します。
サンプルがシンプルになるよう、天気予報をテキストで取得しているだけですが、このサンプルを応用すれば、降水確率や週間天気予報なども取得できるようになりますね。
今回は、気象庁の Web サイトから天気予報を取得するサンプルを紹介しました。
プログラム的には、
- HTTP リクエストを送信
- レスポンスが JSON となっている
- JSON を解析し、データを利用する
と、一般的な WebAPI と同じでしたね。このような背景から『つないでみよう』の連載で取り上げました。
| 前回 | 連載:つないでみよう | 次回 |
0 件のコメント:
コメントを投稿