BODIK APIを使ったJavascriptプログラムを書いてみます。
課題1:BODIK APIを呼び出してみる
問題:BODIK APIを使って、AEDを検索してみる。
基本情報
- JavascriptからWebAPIを呼び出す方法はいくつかありますが、ここでは「fetch」を使います。
- BODIK APIの検索結果はJSON形式で取得できます。
- 検索結果は辞書形式データの配列になっています。
- Javascriptで配列の各要素を調べる場合、「for ... of ...」を使います。
swaggerで試す
最初に、WAPIのswagger(https://wapi.bodik.jp/docs)でAPIを試してみましょう。
AED(GET /aed)のエンドポイントを表示し、「try it out」のボタンを押して、下の方にある青い「Execute」ボタンを押してみます。
検索結果が表示されます。「Request URL」のところを確認します。

「Request URL」は「?」の前方がAPIのURL部分、後方がパラメータになります。
URL部分 パラメータ部分 https://wapi.bodik.jp/aed?select_type=data&maxResults=10&distance=2000
URL部分
https://wapi.bodik.jp/aed これを分解すると BODIK APIのURL:https://wapi.bodik.jp データセット名:aed
パラメータ部分:複数のパラメータが「&」で結合されています。
select_type=data&maxResults=10&distance=2000 これを分解すると select_type=data maxResults=10 distance=2000
Javascriptで記述
では、Javascriptで「BODIK API」を呼び出してみましょう。
JavascriptからWebAPIを呼び出す方法はいくつかありますが、ここでは「fetch」を使います。
「javascript fetch」で検索すると、fetchの使い方を説明したサイトが見つかりますので、調べてみてください。
fetch
Javascriptで「fetch」を使ってWebAPIを呼び出すときは、次のような流れになります。
let url = 'https://xxxxxxxx?a=123&b=456&c=789'; // WebAPIのURLを組み立てる
fetch(url) // fetchを呼びだす
.then(response => response.json())
.then(data => {
alert(JSON.stringify(data); // APIの実行結果を表示する
});
この流れに合わせて、BODIK APIを呼び出してみましょう。
WebAPIのURLを用意する
WebAPIのURLは、APIサーバーのURLとパラメータの組み合わせになります。Javascriptで文字列を組み立てる方法はいくつかありますが、「テンプレートリテラル」が便利です。
let api_server = 'https://wapi.bodik.jp';
let apiname = 'aed';
let url = `${api_server}/${apiname}`; // 逆シングルクォート(shift+@)で囲む
JSONを表示、整形
Javascriptでは、JSON.stringify()メソッドを使って、Javascriptの辞書や配列などを文字列に変換することができます。
JSON.stringify(data)
このままではわかりづらいので、インデントを付けて整形することができます。
JSON.stringify(data, null, 2)
ブラウザに表示
Javascriptで画面に文字列を表示します。
// 出力するエレメントをIDで取得する
let output = document.getElementById('output');
// エレメントの「innerHTML」に文字列をセットする
output.innerHTML = JSON.stringify(data, null, 2);
プログラム(Ver1)
まとめると次のようになります。
テキストエディタに下記の内容を入力し、「program1.html」と名前を付けて保存してください。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>BODIK API</title>
<script type="text/javascript">
let api_server = 'https://wapi.bodik.jp';
let api = 'aed';
let api_url = `${api_server}/${api}`;
fetch(api_url)
.then(response => response.json())
.then(data => {
let output = document.getElementById('output');
output.innerHTML = JSON.stringify(data, null, 2);
});
</script>
</head>
<body>
<h2>BODIK API program #1</h2>
<pre id="output"></pre>
</body>
</html>
エクスプローラなどで、このファイルを実行すると、ブラウザが表示され、「data」の内容が表示されます。
「data」の中は次のような形式になっています。
{
'metadata': {
'api': 'aed',
'selectType': 'DATA',
'totalCount': 27430,
'count': 10
},
'resultsets': {
'type': 'FeatureCollection',
'features': [
{
'type': 'Feature',
'properties': {
'municipalityCode': '12301',
'ID': '',
'municipalityName': '北海道三笠市',
・・・・・・・
}
}
]
}
}
BODIK APIの実行結果の構造は、次のようになります。
data = {
metadata
resultsets: {
features: [ 配列
feature 辞書
feature 辞書
・・・・
]
}
}
featureは次のようになっています。
feature = {
properties, # 各種属性情報
geometry # 位置情報
}
このデータ構造をJavascriptで解析し、propertiesだけを取り出すには、次のようなプログラムを書きます。
let array = []; # propertiesを入れる配列を用意する
let features = data['resultsets']['features']; # featuresは配列
for (let feature of features) { # 配列は、「for .. of」で回す
let properties = feature['properties']; # propertiesは辞書
array.push(properties); # properties部分を配列に入れる
}
alert(JSON.stringify(array)); # 表示する
プログラム(Ver2)
まとめると次のようになります。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>BODIK API</title>
<script type="text/javascript">
let api_server = 'https://wapi.bodik.jp';
let api = 'aed';
let api_url = `${api_server}/${api}`;
fetch(api_url)
.then(response => response.json())
.then(data => {
let output = document.getElementById('output');
let array = [];
let features = data['resultsets']['features'];
for (let feature of features) {
let properties = feature['properties'];
array.push(properties);
}
output.innerHTML = JSON.stringify(array, null, 2);
});
</script>
</head>
<body>
<h2>BODIK API program #1</h2>
<pre id="output"></pre>
</body>
</html>
プログラム(完成版)
エラー処理等を追加して完成版となります。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>BODIK API</title>
<script type="text/javascript">
try {
let api_server = 'https://wapi.bodik.jp';
let api = 'aed';
let api_url = `${api_server}/${api}`;
fetch(api_url)
.then(response => response.json())
.then(data => {
if ('resultsets' in data) {
let resultsets = data['resultsets'];
if ('features' in resultsets) {
let features = resultsets['features'];
let array = [];
for (let feature of features) {
let properties = feature['properties'];
array.push(properties);
}
let output = document.getElementById('output');
output.innerHTML = JSON.stringify(array, null, 2);
} else {
alert('not found "features" in data');
}
} else {
alert('not found "resultsets" in data');
}
})
.catch(error => {
alert('Exception in fetch:' + error);
});
} catch (error) {
alert('Exception:' + error);
}
</script>
</head>
<body>
<h2>BODIK API program #1</h2>
<pre id="output"></pre>
</body>
</html>
お疲れ様でした。
